Description
给一个赋权图(无向图),求0号结点到其余所有结点的最短路径的长度。
Input
先输入一个小于等于100的正整数n,然后输入赋权图的邻接矩阵(10000表示无穷大,并且任意一条简单路径的长度都小于10000)
Output
按结点编号的顺序输出0号结点所有结点的最短路径的长度。
-
Sample Input
6 0 1 4 10000 10000 10000 1 0 2 7 5 10000 4 2 0 10000 1 10000 10000 7 10000 0 3 2 10000 5 1 3 0 6 10000 10000 10000 2 6 0
-
Sample Output
0 1 3 7 4
9
#include<stdio.h> int n; int matr[30][30],ans[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]); } } } void search(){ int i, j, k, tmp[30][30], min, v; bool final[30]; for(i = 0; i < n; i++){ final[i] = false; ans[i] = matr[0][i]; for(j = 0; j < n; j++){ tmp[i][j] = -1; if(ans[i] < 10000){ tmp[i][0] = 0; tmp[i][1] = i; } } } ans[0] = 0; final[0] = true; for(i = 1; i < n; i++){ min = 10000; for(j = 0; j <n ; j++){ if(!final[j] && ans[j]<min){ v=j; min = ans[j]; } } final[v] = true; for(j = 0; j < n; j++){ if(!final[j] && min<10000 && matr[v][j]<10000&& (min+matr[v][j]<ans[j])) { ans[j]=min+matr[v][j]; for(k = 0; k < n; k++) { tmp[j][k]=tmp[v][k]; if(tmp[j][k]==-1) { tmp[j][k]=j; break; } } } } } } void output(){ int i; for(i = 0; i < n; i++){ printf("%d\n",ans[i]); } } int main(){ init(); search(); output(); return 0; }