Description
用迪杰斯特拉算法求一点到其余所有结点的最短路径。
Input
先输入一个小于100的正整数n,然后输入图的邻接矩阵(10000表示无穷大,即两点之间没有边),最后输入两个0到n-1的整数表示两个点。
Output
先用迪杰斯特拉算法求给定的第一个点到其余所有结点的最短路径。
然后再输出给定的两个点之间的最短路径(按顺序输出最短路径上的每一个点,每个数据占一行)。
-
Sample Input
4 0 2 10 10000 2 0 7 3 10 7 0 6 10000 3 6 0 0 2
-
Sample Output
0 1
2
length[]:起始点到第i个点的距离;point[]:第i个点是否被用作新起始点扫描过;way[]:到达第i个点需经过点way[i].
#include<stdio.h> #include<stdlib.h> #define MAX 10000 int n, x, y; int matr[30][30]; bool point[30]; int length[30], way[30]; void init(){ int i, j; scanf("%d", &n); for(i = 0; i < n; i++){ for(j = 0; j < n; j++){ scanf("%d", &matr[i][j]); } point[i] = true; } scanf("%d%d", &x, &y); for(i = 0; i < n; i++){ length[i] = matr[x][i]; way[i] = x; } } void search(){ int i,min,v, m = n - 1; point[x] = false; while(m--){ min = MAX; for(i = 0; i < n; i++){//找出最短路径 if(point[i] && length[i] < min){ min = length[i]; v = i; } } for(i = 0; i < n; i++){ if(matr[v][i] + min < length[i] && point[i]){ length[i] = matr[v][i] + min; way[i] = v; } } point[v] = false; } } void output(){ int tmp, ans[30], i, k = 0; tmp = y; while(tmp != x){ ans[k++] = tmp; tmp = way[tmp]; } ans[k] = way[x]; for(i = k; i >= 0; i--){ printf("%d\n",ans[i]); } } int main(){ init(); search(); output(); }