#include <stdio.h>
#define MAX_VEX 100
int creatcost(int cost[][MAX_VEX]) {
int vexnum, arcnum, i, j, k, v1, v2, w;
printf("\n请输入顶点数和边数(输入格式为:顶点数,边数):");
scanf("%d,%d", &vexnum, &arcnum);
for (i = 1; i <= vexnum; i++)
for (j = 1; j <= vexnum; j++)
cost[i][j] = 9999;
for (k = 1; k <= arcnum; k++) {
printf("请输入边的两个顶点及权重(格式:v1,v2,w):");
scanf("%d,%d,%d", &v1, &v2, &w);
cost[v1][v2] = w;
}
return vexnum;
}
void dijkstra(int cost[][MAX_VEX], int vexnum) {
int path[MAX_VEX], s[MAX_VEX], dist[MAX_VEX];
int i, j, w, v, min, v1;
printf("输入源点:");
scanf("%d", &v1);
for (i = 1; i <= vexnum; i++) {
dist[i] = cost[v1][i];
s[i] = 0;
if (cost[v1][i] < 9999)
path[i] = v1;
}
s[v1] = 1;
for (i = 1; i <= vexnum; i++) {
min = 9999;
for (j = 1; j <= vexnum; j++) {
if (s[j] == 0 && dist[j] < min) {
min = dist[j];
w = j;
}
}
if (min == 9999) break;
s[w] = 1;
for (v = 1; v <= vexnum; v++) {
if (s[v] == 0) {
if (dist[w] + cost[w][v] < dist[v]) {
dist[v] = dist[w] + cost[w][v];
path[v] = w;
}
}
}
}
printf("\n源点 %d 到其他各顶点的路径与距离:\n", v1);
for (i = 1; i <= vexnum; i++) {
if (i != v1) {
if (dist[i] != 9999) {
printf("到顶点 %d 的最短路径: ", i);
int temp = i;
while (temp != v1) {
printf("%d <- ", temp);
temp = path[temp];
}
printf("%d", v1);
printf(",总距离: %d\n", dist[i]);
} else {
printf("到顶点 %d 不可达\n", i);
}
}
}
}
int main() {
int cost[MAX_VEX][MAX_VEX];
int vexnum;
vexnum = creatcost(cost);
dijkstra(cost, vexnum);
return 0;
}