資料結構實驗34——求賦權圖中一個結點到所有結點的最短路徑的長度
阿新 • • 發佈:2019-02-05
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; }