//根据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;
}