無向圖最短路徑


無向圖最短路徑問題,是圖論中最經典也是最基礎的問題之一。本題我們考慮一個有 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     } 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM