您的位置:首页 > 其它

任意两点间的最短路问题(Floyd-Warshall算法)

2017-02-19 19:51 417 查看
 #define _CRT_SECURE_NO_WARNINGS
/*
7 10
0 1 5
0 2 2
1 2 4
1 3 2
2 3 6
2 4 10
3 5 1
4 5 3
4 6 5
5 6 9
0 6
*/
#include <iostream>
#include <vector>
#include <utility>
#include <queue>
#include <functional>
#include <algorithm>
#include <cstdio>
using namespace std;

const int maxn = 1010 + 20;
const int INF = 99999999;

int d[maxn][maxn];         //d[u][v]表示边e=(u,v)的权值(不存在时设为INF,不过d[i][j]=0)
int V, E;

void input();
void warshall_floyd();
void init();

void init() {
for (int i = 0; i < V; i++) {
for (int j = 0; j < V; j++) {
if (i == j) {
d[i][j] = 0;
}
else {
d[i][j] = INF;
}
}
}
}

void input()
{
int s, t, ct;
for (int i = 0; i < E; i++) {
cin >> s >> t >> ct;
d[s][t] = d[t][s] = ct;
}
}

void warshall_floyd()
{
for (int k = 0; k < V; k++) {         //考虑经过顶点k和不经过顶点k的情况
for (int i = 0; i < V; i++) {
for (int j = 0; j < V; j++) {
d[i][j] = min(d[i][j], d[i][k] + d[k][j]);
}
}
}
}

int main()
{
cin >> V >> E;
init();                //必须要初始化
input();
warshall_floyd();
int st, ov;
cin >> st >> ov;       //输入起点终点
cout << d[st][ov] << endl;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: