學校裏面有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; }