【模板】最短路径-Floyd

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_40727946/article/details/86515943

emmm,最暴力的最短路了。

 /*
时间复杂度:O(n3)点的数量
*/

#include<bits/stdc++.h>
using namespace std;
#define MAX 100
#define inf 0x3f3f3f3f
int n,m,cost[MAX][MAX];//n表示点的数量 m表示边的数量 cost表示花费 
void init()//初始化 
{
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n;j++)
		{
			if(i==j)
				cost[i][j]=0;
			else
				cost[i][j]=inf;
		}
	}
}
void floyd()
{
	for(int k=1;k<=n;k++)
		for(int i=1;i<=n;i++)
			for(int j=1;j<=n;j++)
				if(cost[i][k]<inf&&cost[k][j]<inf&&cost[i][j]>cost[i][k]+cost[k][j])
					cost[i][j]=cost[i][k]+cost[k][j];
					//也可以用来求有向图的传递闭包
					// cost[i][j]=cost[i][j]||(cost[i][k]&&cost[k][j]);
}

int main()
{
	cin>>n>>m;
	init();
	for(int i=0;i<m;i++)
	{
		int a,b,c;
		cin>>a>>b>>c;
		//无向图 
		cost[a][b]=c;
		cost[b][a]=c;
	}
	floyd();
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n;j++)
		{
			cout<<cost[i][j]<<endl;
		}
	}
	return 0;
} 
/*
in:
4 8
1 2 2
1 3 6
1 4 4
2 3 3
3 1 7
3 4 1
4 1 5
4 2 12
out:
0
2
5
5
2
0
3
4
5
3
0
1
5
4
1
0
*/

猜你喜欢

转载自blog.csdn.net/qq_40727946/article/details/86515943