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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

最短路径之Floyd算法

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

Floyd-Warshall算法,簡稱Floyd算法,用于求解任意兩點間的最短距離,時間復雜度為O(n^3)。

?

輸出權值大小及路徑:

#include <iostream> #include <string.h> #include <stdio.h>using namespace std; const int N = 105; const int INF = 1<<29;int n,m; int map[N][N]; int dist[N][N]; int path[N][N];void Init() {for(int i=1; i<=n; i++)for(int j=1; j<=n; j++)map[i][j] = (i == j) ? 0 : INF; }void Floyd() {for(int i=1; i<=n; i++){for(int j=1; j<=n; j++){dist[i][j] = map[i][j];path[i][j] = 0;}}for(int k=1; k<=n; k++){for(int i=1; i<=n; i++){for(int j=1; j<=n; j++){if(dist[i][k] + dist[k][j] < dist[i][j]){dist[i][j] = dist[i][k] + dist[k][j];path[i][j] = k;}}}} }void OutPut(int i,int j) {if(i == j) return;if(path[i][j] == 0)cout<<"-->"<<j;else{OutPut(i,path[i][j]);OutPut(path[i][j],j);} }int main() {while(cin>>n>>m){Init();while(m--){int u,v,w;cin>>u>>v>>w;map[u][v] = w;map[v][u] = w;}int s,t;cin>>s>>t;Floyd();if(dist[s][t] == INF)cout<<"-1"<<endl;elsecout<<dist[s][t]<<endl;cout<<s;OutPut(s,t);cout<<endl;}return 0; }


?

題目:http://acm.hdu.edu.cn/showproblem.php?pid=1385

?

題意:給定一個有向圖,每兩點之間要么連接,要么不連接,給出所有連接的邊的權值,從點a到點b的花費為路徑上所有權

值之和加上通過每個點所需要的tax,求a到b的最小花費并輸出路徑。(如果存在多個最小值,輸出經過中間站最少的那個解)

?

#include <iostream> #include <string.h> #include <stdio.h>using namespace std; const int N = 205; const int INF = 1<<29;int map[N][N]; int path[N][N]; int tax[N]; int n;void Floyd() {for(int i=1; i<=n; i++)for(int j=1; j<=n; j++)path[i][j] = j;for(int k=1; k<=n; k++){for(int i=1; i<=n; i++){for(int j=1; j<=n; j++){int tmp = map[i][k] + map[k][j] + tax[k];if(tmp < map[i][j]){map[i][j] = tmp;path[i][j] = path[i][k];}else if(tmp == map[i][j] && path[i][j] > path[i][k])path[i][j] = path[i][k];}}} }void Import() {for(int i=1; i<=n; i++){for(int j=1; j<=n; j++){cin>>map[i][j];if(map[i][j] == -1)map[i][j] = INF;}}for(int i=1; i<=n; i++)cin>>tax[i]; }int main() {while(cin>>n){if(n == 0) break;Import();Floyd();while(1){int a,b;cin>>a>>b;if(a==-1 && b==-1) break;cout<<"From"<<" "<<a<<" "<<"to"<<" "<<b<<" "<<":"<<endl;cout<<"Path: "<<a;int k = a;while(k != b){cout<<"-->"<<path[k][b];k = path[k][b];}cout<<endl;cout<<"Total cost : "<<map[a][b]<<endl;cout<<endl;}}return 0; }


?

?

總結

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

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