B3611 【模板】传递闭包

37 阅读1分钟

B3611 【模板】传递闭包

这题使用的是floyd求最短路,因为是一道多源最短路的问题,并且这道题目的初始化与floyd的模板稍有不同,这题在初始化的时候需要把每一个点对设置成0x3f3f3f3f,原因是这题每个点对于它本身在被赋值之前都是无法到达的,例如样例中的1,2,4这三个点可以形成一个循环,每一个点都可以通过循环到达自己的点而对于3号点,他只有一条指向4的边故无法到达自己的点。

#include<bits/stdc++.h>

using namespace std;

typedef long long ll;

typedef unsigned long long ull;

typedef pair <ll , ll> pii;

typedef priority_queue <ll ,vector ,greater > xiao;

typedef priority_queue <ll ,vector ,less > da;

const int N=1e5 + 10,M = 0x3f3f3f3f;

const ull P = 131;

int n;

int g[105][105];

void floyd()

{

for(int k = 1 ; k <= n ; k++)
{
	for(int i = 1 ; i <= n ; i++)
	{
		for(int j = 1 ; j <= n ; j++)
		{

			g[i][j] = min(g[i][j] , g[i][k] + g[k][j]);
		}
	}
}

}

int main()

{

std::ios::sync_with_stdio(false);
std::cin.tie(0),cout.tie(0);

cin>>n;
for(int i = 1 ; i <= n ; i++)
{
	for(int k = 1 ; k <= n ; k++)
	{
		g[i][k] = M;
	}
}

for(int i = 1 ; i <= n ; i++)
{
	for(int j = 1 ; j <= n ; j++)
	{
		int num;
		cin>>num;
		if(num)
		{
			g[i][j] = min(g[i][j] , num);
		}
	}
}

floyd();

for(int i = 1 ; i <= n ; i++)
{
	for(int j = 1 ; j <= n ; j++)
	{
		if(g[i][j] == M)
		{
			cout<<0<<" ";
		}else
		{
			cout<<1<<" ";
		}
	}
	
	cout<<"\n";
}

}