#include
#define SIZE 110
#define INF 1000000;
int map[SIZE][SIZE]; //邻接矩阵存储
int len[SIZE]; //d[i]表示源点到i这个点的距离
int visit[SIZE]; //节点是否被访问
int n;
void dijkstra(int from, int to){ //从源点到目标点
int path[100];
int h=0;
path[0]=from;
int i;
for(i = 1 ; i <= n ; i ++){ //初始化
visit[i] = 0; //一开始每个点都没被访问
len[i] = map[from][i]; //先假设源点到其他点的距离
}
int j;
for(i = 1 ; i < n ; i++){ //对除源点的每一个点进行最短计算
int min = INF; //记录最小len[i]
int pos; //记录最小len[i] 的点
for(j = 1 ; j <= n ; j++){
if((!visit[j]) && min > len[j]){
pos = j;
min = len[j];
}
}
visit[pos] = 1;
if(visit[to]==1){break;}
for(j = 1 ; j <= n ; j++){
if((!visit[j] )&& (len[j] > (len[pos] +map[pos][j]))){ //如果j节点没有被访问过&&源节点到j节点的最短路径>源节点到pos节点的最短路径+pos节点到j节点的路径
len[j] = len[pos] + map[pos][j]; //更新源节点到j节点的最短路径
printf("%d",pos);
h++;
path[h]=pos;
}
}
}
h++;
path[h]=to;
printf("最短距离为:");
printf("%d\n",len[to]);
printf("路径为:");
for(i=0;i<h;i++){
printf("%d->",path[i]);}
printf("%d",path[h]);
}
void main () {
int i,j;
int f,t;
printf("请输入起点:");
scanf("%d",&f);
printf("请输入终点:");
scanf("%d",&t);
n = 6; //测试数据
for(i = 1 ; i <= n ; ++i){ //设一开始每个点都不可达
for(j = 1 ; j <= n ; ++j){
map[i][j] = INF;
}
}
map[1][2] = 7; //测试数据
map[1][3] = 9;
map[1][6] = 14;
map[2][3] = 10;
map[2][4] = 15;
map[3][6] = 2;
map[5][6] = 9;
map[4][5] = 6;
map[3][4] = 11;
for(i=1;i<=n;i++){
map[i][i]=0;}
dijkstra(f,t);
}