//Floyd-Warshall算法
//如果时间允许的话可以用很好用也比较简单
//Floyd-Warshall算法核心语句 for(int k = 1; k <= n; k++) { for(int i = 1; i <= n; i++) { for(int j = 1; j <= n; j++) { if(e[i][j] > e[i][k] + e[k][j]) { e[i][j] = e[i][k] + e[k][j]; } } } }
从1顶点开始求最短路劲当比较完后更新数据然后再从2的基础上看能不能加使得路劲最短用了一些动态规划的思想
# include <iostream>
# include <numeric>
# include <algorithm>
# include <functional>
# include <list>
# include <map>
# include <set>
# include <stack>
# include <deque>
# include <queue>
# include <vector>
# include <ctime>
# include <cstdlib>
# include <cmath>
# include <string>
using namespace std;
int main(int argc, char *argv[])
{
int e[10][10];
const int maxn = 0x3f3f3f3f;
int n, m;
//n表示顶点,m表示边的条数
cin >> n >> m;
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= n; j++)
{
if(i == j)
{
e[i][j] = 0;
}
else
e[i][j] = maxn;
}
}
//读入边
for(int i = 1; i <= m; i++)
{
int a, b, s;
cin >> a >> b >> s;
e[a][b] = s;
}
//Floyd-Warshall算法核心语句
for(int k = 1; k <= n; k++)
{
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= n; j++)
{
if(e[i][j] > e[i][k] + e[k][j])
{
e[i][j] = e[i][k] + e[k][j];
}
}
}
}
cout << "输出最终结果:" << endl;
//输出最终结果
for(int i = 1; i <= n; i++)
{
int p = 0;
for(int j = 1; j <= n; j++)
{
if(p++)
{
cout << " ";
}
cout << e[i][j];
}
cout << endl;
}
return 0;
}
/*
//输入数据
4 8
1 2 2
1 3 6
1 4 4
2 3 3
3 1 7
3 4 1
4 1 5
4 3 12
//最终结果
输出最终结果:
0 2 5 4
9 0 3 4
6 8 0 1
5 7 10 0
*/