無向圖最短路徑問題,是圖論中最經典也是最基礎的問題之一。本題我們考慮一個有 nn 個結點的無向圖 GG。
GG 是簡單完全圖,也就是說 GG 中沒有自環,也沒有重邊,但任意兩個不同的結點之間都有一條帶權的雙向邊。
每一條邊的邊權是非負實數,但我們並不知道每一條邊的具體邊權。
好消息是我們知道 GG 中任意兩點最短路徑的長度d(i,j)d(i,j)。且保證至少有一種邊權的分配方案滿足得到的帶權圖中ii與jj的最短路長度恰好是d(i,j)d(i,j)。
下面是留給你的任務:對於任意一對點(i,j)(i,j),希望你能找出來所有合法的邊權分配方案中ii和jj之間邊權的最大值。
1 #include<iostream> 2 #include<string> 3 using namespace std; 4 5 int n,m; 6 int a[101][101],d[101][101]={0}; 7 8 int main() 9 { 10 cin>>n; 11 while(n--) 12 { 13 cin>>m; 14 for(int i=1;i<=m;++i) 15 for(int j=1;j<=m;++j) 16 cin>>a[i][j]; 17 18 for(int i=1;i<=m;++i) 19 for(int j=1;j<=m;++j) 20 if(i!=j) 21 { 22 int l=1000; 23 for(int k=1;k<=m;++k) 24 if(k!=i&&k!=j&&a[i][k]+a[k][j]<l) 25 l=a[i][k]+a[k][j]; 26 if(l==a[i][j]) d[i][j]=10000; 27 else d[i][j]=a[i][j]; 28 } 29 30 for(int i=1;i<=m;++i) 31 { 32 for(int j=1;j<=m;++j) 33 { 34 if(j!=1) cout<<" "; 35 if(d[i][j]==10000) cout<<"infty"; 36 else cout<<d[i][j]; 37 } 38 39 cout<<endl; 40 } 41 } 42 // system("pause"); 43 44 }