1. 程式人生 > >淺談Floyd解決最短路問題

淺談Floyd解決最短路問題

我這條鹹魚又來啦!!啊哈演算法看到結尾部分,大佬說要給我幾個題測測我到什麼水平了,於是就有了這篇在被虐中寫出的部落格,不廢話了,粘題
在這裡插入圖片描述
大佬告訴我說這是一道裸的不能再裸的最短路題,但我還是掛了好幾次(鹹魚沒跑了
先粘上我開始的錯誤程式碼再慢慢說

#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迴圈的判斷條件導致超時,所以在這裡先不繼續討論,等之後搞清楚了再回來填這個坑

題外話:
據大佬所說,這只是一道普及-的題,我還是做的這麼費勁,感覺後面各種提高題可能會把我做死,看來真·鹹魚說的就是我了,希望以後能和大佬越來越接近吧