ssl1763-观光旅游【最小环,Floyd,dijkstra】
生活随笔
收集整理的這篇文章主要介紹了
ssl1763-观光旅游【最小环,Floyd,dijkstra】
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
正題
就是給出一個無向圖,求最小環。
輸入輸出(需要自取)
Input
每組數據的第一行包含兩個正整數:十字路口的個數N(N<=100),另一個是道路的 數目M(M<10000)。接下來的每一行描述一條路:每一行有三個正整數:這條路連接的兩個路口的編號,以及這條路的長度(小于500的正整數)。
Output
每一行輸出都是一個答案。如果這條觀光路線是不存在的話就顯示“No solution”;或者輸出這條最短路線的長度。
Sample Input
樣例1
5 7
1 4 1
1 3 300
3 1 10
1 2 16
2 3 100
2 5 15
5 3 20
樣例2
4 3
1 2 10
1 3 20
1 4 30
-1
Sample Output
樣例1
61
樣例2
No solution
解題1:Floyd算法
就是一個Floyd算法,然后在中間統計一下最小環。
代碼(Floyd)
#include<cstdio> #include<iostream> #include<cstring> using namespace std; int n,m,a[101][101],dis[101][101],ans,from,to,lon; int main() {scanf("%d%d",&n,&m);memset(a,127/3,sizeof(a));memset(dis,127/3,sizeof(dis));for (int i=1;i<=m;i++){scanf("%d%d%d",&from,&to,&lon);a[from][to]=lon;a[to][from]=lon;//記錄距離dis[from][to]=lon;dis[to][from]=lon;//記錄最短路}ans=707406377;for (int k=1;k<=n;k++){for (int i=1;i<=n;i++)for (int j=i+1;j<=n;j++)if (dis[i][j]!=dis[0][0])ans=min(ans,dis[i][j]+a[i][k]+a[k][j]);//更新最小環for (int i=1;i<=n;i++)for (int j=1;j<=n;j++)dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);//更新最短路}if (ans==707406377) printf("No solution");else printf("%d",ans); }當然,也可以進行優化,當k沒有枚舉到這個點時,那么后面的都沒有被算出來,而且這是個無向圖
代碼(Floyd優化)
#include<cstdio> #include<iostream> #include<cstring> using namespace std; int n,m,a[101][101],dis[101][101],ans,from,to,lon; int main() {scanf("%d%d",&n,&m);memset(a,127/3,sizeof(a));memset(dis,127/3,sizeof(dis));for (int i=1;i<=m;i++){scanf("%d%d%d",&from,&to,&lon);a[from][to]=lon;a[to][from]=lon;dis[from][to]=lon;dis[to][from]=lon;}ans=707406377;for (int k=1;k<=n;k++){for (int i=1;i<k;i++)for (int j=i+1;j<k;j++)if (dis[i][j]!=dis[0][0])ans=min(ans,dis[i][j]+a[i][k]+a[k][j]);for (int i=1;i<=n;i++)for (int j=1;j<=n;j++)dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);}if (ans==707406377) printf("No solution");else printf("%d",ans); }解題2:dijkstra
枚舉邊,然后刪去那條邊,然后求那條邊頭尾最短路,接下來恢復那條邊,加上那條邊的權值就是一個環的長度。
代碼(dijkstra)
#include<cstdio> #include<iostream> #include<cstring> using namespace std; int w,minl,n,m,a[101][101],c[101],ans,from,to,lon,l[10001][2],mn,s; bool b[101]; int main() {scanf("%d%d",&n,&m);mn=0;memset(a,127/3,sizeof(a));for (int i=1;i<=m;i++){scanf("%d%d%d",&from,&to,&lon);a[from][to]=lon;a[to][from]=lon;l[++mn][0]=from;l[mn][1]=to;//記錄邊}ans=707406377;for (int k=1;k<=mn;k++){int o=a[l[k][0]][l[k][1]];a[l[k][0]][l[k][1]]=707406378;a[l[k][1]][l[k][0]]=707406378;//刪邊s=l[k][0];for (int i=1;i<=n;i++) c[i]=a[s][i];memset(b,false,sizeof(b));b[s]=true;c[s]=0;for (int i=1;i<n;i++){minl=707406377;w=0;for (int j=1;j<=n;j++)if (!b[j] && c[j]<minl){minl=c[j];w=j;}if (w==0) break;b[w]=true;for (int j=1;j<=n;j++)if (c[w]+a[w][j]<c[j])c[j]=c[w]+a[w ][j];}//以上dij不解釋ans=min(ans,c[l[k][1]]+o);//求該環長度a[l[k][0]][l[k][1]]=o;//恢復兩條邊a[l[k][1]][l[k][0]]=o;}if (ans==707406377) printf("No solution");else printf("%d",ans); }總結
以上是生活随笔為你收集整理的ssl1763-观光旅游【最小环,Floyd,dijkstra】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 张小宇是什么电视剧 张小宇的扮演者是谁
- 下一篇: 愿无岁月可回头且以深情共余生是什么意思