最短路径之Floyd算法
生活随笔
收集整理的這篇文章主要介紹了
最短路径之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算法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 博弈论初步学习
- 下一篇: HDU4259(简单群置换)