Floyd-Warshall

Floyd是采用动态规划的方案来解决在一个有向图G=(V,E)上每对顶点间的最短路径问题。

  • 用来算多源间最短距离和路径。
  • 时间复杂度 O(n^3)
  • 空间复杂度 O(n^2)
  • 可以处理带有负权边的(边为负数)的图,但是不能处理带有“负权回路”的图。例如下面这个图就不存在1号顶点到3号顶点的最短路径。因为1->2->3->1->2->3->…->1->2->3这样路径中,每绕一次1->-2>3这样的环,最短路就会减少1,永远找不到最短路。其实如果一个图中带有“负权回路”那么这个图则没有最短路。

    核心只有五行代码:
for(k=1;k<=n;k++)
    for(i=1;i<=n;i++)
        for(j=1;j<=n;j++)
            if(e[i][j]>e[i][k]+e[k][j])
                 e[i][j]=e[i][k]+e[k][j];

题目描述

暑假,小哼准备去一些城市旅游。有些城市之间有公路,有些城市之间则没有,如下图。为了节省经费以及方便计划旅程,小哼希望在出发之前知道任意两个城市之前的最短路程。

输入

第一行四个数为n,m,n表示顶点个数,m表示边的条数。
接下来m行,每一行有三个数t1、t2 和t3,表示顶点t1到顶点t2的路程是t3。请注意这些t1->t2是单向的。

输出

输出一个n*n的矩阵,第n行第n列表示定点n到n的距离。每一行两个数间由空格隔开

示例

输入:
5 8
1 2 2
2 3 3
3 4 4
4 5 5
5 3 3
3 1 4
2 5 7
1 5 10
输出:
0 2 5 9 9
7 0 3 7 7
4 6 0 4 9
12 14 8 0 5
7 9 3 7 0

代码

#include
using namespace std;
int main()
{
	int a[100][100];
	int n,m,b,c,d;
	cin>>n>>m;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			if(i==j)	
				a[i][j]=0;
			else
				a[i][j]=INT_MAX;
	for(int i=1;i<=m;i++)
	{
		cin>>b>>c>>d;
		a[b][c]=d;
	}
	//Floyd-Warshall核心语句
	for(int i=1;i<=n;i++)
			for(int j=1;j<=n;j++)
				for(int k=1;k<=n;k++)
					if(a[j][k]>a[j][i]+a[i][k]) 
						a[j][k]=a[j][i]+a[i][k];
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n;j++)
			cout<

你可能感兴趣的:(图)