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";
}
}