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
#include <stdio.h> #include <stdlib.h> #define maxnum 130 #define maxint 10000 void Dijkstra(int n, int v, int *dist, int *prev,int matrix[maxnum][maxnum]) { bool visited[maxnum]; int i, j; for(i = 1; i <= n; i ++) { dist[i] = matrix[v][i]; visited[i] = 0; if(dist[i] == maxint) prev[i] = 0; else prev[i] = v; } dist[v] = 0; visited[v] = 1; for(i = 2; i <= n; i++) { int temp = maxint; int u = v; for(j = 1; j <= n; j ++) { if((visited[j]==0) && (dist[j]<temp)) { u = j; temp = dist[j]; } } visited[u] = 1; for(j = 1; j <= n; j++) { if((visited[j]==0) && (matrix[u][j]<maxint)) { int newdist = dist[u]+matrix[u][j]; if(newdist < dist[j]) { dist[j] = newdist; prev[j] = u; } } } } } void searchpath(int prev[],int m,int n) { int ans[100]; int i=0,j; while(n!=m) { ans[i]=n; n=prev[n]; i++; } ans[i]=n; for(j=i;j>=0;j--) { printf("%d\n",ans[j]-1); } } int main() { int dist[maxnum]; int prev[maxnum]; int matrix[maxnum][maxnum]; int n; int x,y; scanf("%d",&n); int i, j; for(i = 1; i <= n; i ++) { for(j = 1; j <= n; j ++) { scanf("%d",&matrix[i][j]); } } scanf("%d %d",&x,&y); Dijkstra(n, x+1 , dist, prev, matrix); searchpath(prev , x+1 , y+1); }prev数组里存有之前经过的节点,所以想办法输出即可。