日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發(fā)布時(shí)間:2023/12/3 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ssl1763-观光旅游【最小环,Floyd,dijkstra】 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

正題

就是給出一個(gè)無向圖,求最小環(huán)。


輸入輸出(需要自取)

Input

每組數(shù)據(jù)的第一行包含兩個(gè)正整數(shù):十字路口的個(gè)數(shù)N(N<=100),另一個(gè)是道路的 數(shù)目M(M<10000)。接下來的每一行描述一條路:每一行有三個(gè)正整數(shù):這條路連接的兩個(gè)路口的編號(hào),以及這條路的長(zhǎng)度(小于500的正整數(shù))。

Output

  每一行輸出都是一個(gè)答案。如果這條觀光路線是不存在的話就顯示“No solution”;或者輸出這條最短路線的長(zhǎng)度。

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算法

就是一個(gè)Floyd算法,然后在中間統(tǒng)計(jì)一下最小環(huán)。

代碼(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]);//更新最小環(huán)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); }

當(dāng)然,也可以進(jìn)行優(yōu)化,當(dāng)k沒有枚舉到這個(gè)點(diǎn)時(shí),那么后面的都沒有被算出來,而且這是個(gè)無向圖

代碼(Floyd優(yōu)化)

#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

枚舉邊,然后刪去那條邊,然后求那條邊頭尾最短路,接下來恢復(fù)那條邊,加上那條邊的權(quán)值就是一個(gè)環(huán)的長(zhǎng)度。

代碼(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);//求該環(huán)長(zhǎng)度a[l[k][0]][l[k][1]]=o;//恢復(fù)兩條邊a[l[k][1]][l[k][0]]=o;}if (ans==707406377) printf("No solution");else printf("%d",ans); }

總結(jié)

以上是生活随笔為你收集整理的ssl1763-观光旅游【最小环,Floyd,dijkstra】的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。