Floyd-Warshall

//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
*/



猜你喜欢

转载自blog.csdn.net/i_o_fly/article/details/79990809