最優的路線(floyd最小環)

問題描述

學校裏面有N個景點。兩個景點之間可能直接有道路相連,用Dist[I,J]表示它的長度;不然它們之間沒有直接的道路相連。這裏所說的道路是沒有規定方向的,也就是說,若是從I到J有直接的道路,那麼從J到I也有,而且長度與之相等。學校規定:每一個遊客的旅遊線路只能是一個迴路(好霸道的規定)。也就是說,遊客能夠任取一個景點出發,依次通過若干個景點,最終回到起點。一天,Xiaomengxian決定到湖南師大附中旅遊。因爲他實在已經很累了,因而他決定儘可能少走一些路。因而他想請你——一個優秀的程序員——幫他求出最優的路線。怎麼樣,不是很難吧?ios

輸入文件

輸入中有多組數據。程序員

對於每組數據:spa

第一行有兩個正整數N,M,分別表示學校的景點個數和有多少對景點之間直接有邊相連。(N<=100,M<=10000)code

如下M行,每行三個正整數,分別表示一條道路的兩端的編號,以及這條道路的長度。blog

輸出文件

對於每組數據,輸出一行:ci

若是該回路存在,則輸出一個正整數,表示該回路的總長度;不然輸出「No solution.」(不要輸出引號)string

樣例輸入

5 6
1 4 1
3 1 10
1 2 16
2 3 100
2 5 15
5 3 20
4 3
1 2 10
1 3 20
1 4 30

樣例輸出

61
No solution.

限制和約定

時間限制:1sit

空間限制:128MBio

 

#include<iostream> #include<cstring> #include<algorithm> #include<cstring> #include<cstdio>
using namespace std; const int maxn = 100 + 2 ; const int Inf=(1<<25);//不能存極大值,下面相加會致使溢出變成負值 
int dist[maxn][maxn],f[maxn][maxn]; int n,m; int main() { while(scanf("%d%d",&n,&m)==2) { memset(dist,0,sizeof(dist)); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) dist[i][j]=f[i][j]=Inf; for(int i=1,u,v,x;i<=m;i++) { cin>>u>>v>>x; f[u][v]=f[v][u]=dist[u][v]=dist[v][u]=x;//無向圖 
 } int ans=Inf; for(int k=1;k<=n;k++) { for(int i=1;i<=n;i++) for(int j=i+1;j<=n;j++) ans=min(ans,f[i][j]+dist[i][k]+dist[k][j]);//先處理ans防止重複走一條邊 
            for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) f[i][j]=min(f[i][j],f[i][k]+f[k][j]);// 直接弗洛伊德 
 } if(ans==Inf) cout<<"No solution."<<endl;//若是沒有環,輸出 No solution.
        else cout<<ans<<endl; } return 0; }
相關文章
相關標籤/搜索