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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

hdu 2544最短路 Floyd算法

發布時間:2025/3/16 编程问答 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 hdu 2544最短路 Floyd算法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

最短路

Time Limit : 5000/1000ms (Java/Other)???Memory Limit : 32768/32768K (Java/Other)
Problem Description 在每年的校賽里,所有進入決賽的同學都會獲得一件很漂亮的t-shirt。但是每當我們的工作人員把上百件的衣服從商店運回到賽場的時候,卻是非常累的!所以現在他們想要尋找最短的從商店到賽場的路線,你可以幫助他們嗎?

Input 輸入包括多組數據。每組數據第一行是兩個整數N、M(N<=100,M<=10000),N表示成都的大街上有幾個路口,標號為1的路口是商店所在地,標號為N的路口是賽場所在地,M則表示在成都有幾條路。N=M=0表示輸入結束。接下來M行,每行包括3個整數A,B,C(1<=A,B<=N,1<=C<=1000),表示在路口A與路口B之間有一條路,我們的工作人員需要C分鐘的時間走過這條路。
輸入保證至少存在1條商店到賽場的路線。
Output 對于每組輸入,輸出一行,表示工作人員從商店走到賽場的最短時間 Sample Input 2 1 1 2 3 3 3 1 2 5 2 3 5 3 1 2 0 0 Sample Output 3 2前面用了Dijkstra算法做了這個題,下面再用Floyd算法做一下。我認為Floyd算法比Dijkstra簡單,實現起來也比較容易,就是時間復雜度有點高,為n^3. Floyd算法另外的優點就是不必n次調用Dijkstra,還可以解決有負權(即邊為負)的問題。下面是主要代碼,一定要記住。for(i=0;i<n;i++) for(j=0;j<n;j++) for(k=0;k<n;k++) if(d[j][k]>d[j][i]+d[i][k]) d[j][k]=d[j][i]+d[i][k];AC代碼:#include<stdio.h> #include<string.h> #define inf 999999 int main() {int d[105],len[105][105],vis[105];int i,j,k,a,b,c,n,m;while(scanf("%d%d",&n,&m)&&m!=0&&n!=0){for(i=1;i<=n;i++)for(j=1;j<=n;j++)len[i][j]=len[j][i]=inf; //初始任意兩點的距離為inffor(i=1;i<=m;i++){scanf("%d%d%d",&a,&b,&c);len[a][b]=c;len[b][a]=c; //a->b和b->a的距離都為c}for(i=2;i<=n;i++)d[i]=len[1][i]; //d[i]表示從1到i點要走的距離memset(vis,0,sizeof(vis)); //初始化剛開始都未訪問過vis[1]=1; //從1開始查找 int min;k=1;for(i=1;i<n;i++){min=inf;for(j=1;j<=n;j++){if(d[j]<min&&(!vis[j])) //如果j點未訪問,且1到j的距離比min小{min=d[j]; k=j;}}vis[k]=1; //從到1距離最短的點查找for(j=1;j<=n;j++){if(!vis[j]&&d[j]>d[k]+len[k][j])//增加新的結點d[j]=d[k]+len[k][j];}}printf("%d\n",d[n]);}return 0; }


#include<stdio.h> #define INF 1<<25 const int N = 120; int d[N][N];void read_graph(int n, int m) {int u, v, w, i, j;for(i = 1; i <= n; i++)for(j = 1; j <= n; j++){if(i == j)d[i][j] = 0;elsed[i][j] = INF;}for(i = 0; i < m; i++){scanf("%d%d%d",&u, &v, &w);d[u][v] = d[v][u] = w;} }void Floyd(int n) {for(int k = 1; k <= n; k++)for(int i = 1; i <= n; i++)for(int j = 1; j <= n; j++)if(d[i][k] < INF && d[k][j] < INF)if(d[i][j] > d[i][k] + d[k][j])d[i][j] = d[i][k] + d[k][j]; }int main() {int n, m;while(~scanf("%d%d",&n,&m)){if(n == 0 && m == 0) break;read_graph(n, m);Floyd(n);printf("%d\n",d[1][n]);}return 0; }

總結

以上是生活随笔為你收集整理的hdu 2544最短路 Floyd算法的全部內容,希望文章能夠幫你解決所遇到的問題。

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