//根据bfs修改而来
#include<stdio.h>
#include<stdlib.h>
typedef struct queue {
int data;
struct queue* next;
}queue, * linklist;
float dist_list[9];
//出发点为0
int forward_point_list[9] = { -1 };
linklist front = NULL;
linklist rear = NULL;
float map_frame[9][9] = { 0,4,-1,-1,-1,-1,-1,8,-1,
4,0,8,-1,-1,-1,-1,11,-1,
-1,8,0,7,-1,4,-1,-1,2,
-1,-1,7,0,9,14,-1,-1,-1,
-1,-1,-1,9,0,10,-1,-1,-1,
-1,-1,4,14,10,0,2,-1,-1,
-1,-1,-1,-1,-1,2,0,1,6,
8,11,-1,-1,-1,-1,1,0,7,
-1,-1,2,-1,-1,-1,6,7,0 };
void enqueue(int v) {
linklist node = (linklist)malloc(sizeof(queue));
node->data = v;
node->next = NULL;
if (!front) {
front = rear = node;
}
else {
rear->next = node;
rear = node;
}
}
int dequeue() {
if (!front) {
return -1;
}
linklist tmp = front;
int v = front->data;
front = front->next;
if (!front) {
rear = NULL;
}
free(tmp);
return v;
}
bool isEmpty() {
return front == NULL;
}
void DJSTRA(int v,int search) {
enqueue(v);
dist_list[v] = map_frame[v][v];
forward_point_list[v] = v;
while (isEmpty() == false) {
v = dequeue();
for (int i = 0; i < 9; i++) {
if (map_frame[v][i] > 0) {
if (dist_list[i] > dist_list[v] + map_frame[v][i]) {
dist_list[i] = dist_list[v] + map_frame[v][i];
forward_point_list[i] = v;
enqueue(i);
}
}
}
}
for (int j = 0; j < 9; j++) {
printf("%f\n", dist_list[j]);
}
while (search != 0) {
printf("点%d由",search);
search = forward_point_list[search];
printf("%d而来\n",search);
}
}
int main() {
for (int j = 0; j < 9; j++) {
dist_list[j] = 100.0;
}
DJSTRA(0,4);
return 0;
}