日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

ssl1763-观光旅游【最小环,Floyd,dijkstra】

發布時間:2023/12/3 54 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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】的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。