淺談Floyd解決最短路問題
阿新 • • 發佈:2018-12-12
我這條鹹魚又來啦!!啊哈演算法看到結尾部分,大佬說要給我幾個題測測我到什麼水平了,於是就有了這篇在被虐中寫出的部落格,不廢話了,粘題
大佬告訴我說這是一道裸的不能再裸的最短路題,但我還是掛了好幾次(鹹魚沒跑了)
先粘上我開始的錯誤程式碼再慢慢說
#include<bits/stdc++.h>
using namespace std;
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int n,m,u,v,w,e[100][100];
int inf=99999;
cin>>n>> m;
while(n!=0||m!=0){
memset(e,0,sizeof(e));
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(i==j)
e[i][j]=0;
else
e[i][j]=inf;
for(int i=1;i<=m;i++){
cin>>u>>v>>w;
e[u][v]=w;
e[v][u]=w;
}
for(int k=1;k<=n;k++)
for(int i=1;i<=n; i++)
for(int j=1;j<=n;j++)
if(e[i][j]>e[i][k]+e[k][j])
e[i][j]=e[i][k]+e[k][j];
cout<<e[1][n]<<endl;
cin>>n>>m;
}
}
這段程式碼看著沒有毛病(只是對我來說看著沒有毛病) ,樣例啥的也都能過,但交題的時候出現了超時的毛病,開始時我以為是for迴圈初始化矩陣導致執行時間變長,也就是下面這一段程式
for(int i=1;i<=n;i++)
for(int j=1; j<=n;j++)
if(i==j)
e[i][j]=0;
else
e[i][j]=inf;
但大佬告訴我這個for迴圈是自環,只是從1到n,時間上可以忽略不計,然後大佬把他的程式碼發給了我讓我比著改改,最後終於過了可把我牛逼壞了,這裡再粘上對的程式碼
#include<bits/stdc++.h>
using namespace std;
int e[1000][1000];
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);//關閉c語言裡面的輸入輸出
int n,m,u,v,w;
int inf=99999;
while(cin>>n>>m&&m&&n){
memset(e,0,sizeof(e));//初始化陣列e
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(i==j)
e[i][j]=0;
else
e[i][j]=inf;//for迴圈初始化矩陣
for(int i=1;i<=m;i++){
cin>>u>>v>>w;//使用for迴圈儲存兩個點和兩點間的距離
e[u][v]=w;//e[u][v]中表示從u到v,w表示u和v之間的距離
e[v][u]=w;//因為是無向最短路,所以反過來也是一樣
}
for(int k=1;k<=n;k++)//Flody核心程式碼
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(e[i][j]>e[i][k]+e[k][j])//判斷最短路
e[i][j]=e[i][k]+e[k][j];//更新最短路
cout<<e[1][n]<<endl;//輸出從起點到終點的最短距離
}
}
在這裡,我將while迴圈的條件做了修改
//修改前
cin>>n>>m;
while(n!=0||m!=0)
//修改後
while(cin>>n>>m&&m&&n)
由於不清楚是不是因為while迴圈的判斷條件導致超時,所以在這裡先不繼續討論,等之後搞清楚了再回來填這個坑
題外話:
據大佬所說,這只是一道普及-的題,我還是做的這麼費勁,感覺後面各種提高題可能會把我做死,看來真·鹹魚說的就是我了,希望以後能和大佬越來越接近吧