题目大意:给一些有向边,如果两个点可以互达,那么这两个点属于同一组,求你给有向图分组。
题解:Floyed+并查集。
#include<bits/stdc++.h>
using namespace std;
int per[350];
int find(int x)
{
if(x==per[x])
return x;
return per[x]=find(per[x]);
}
int main()
{
int t;
cin>>t;
while(t--)
{
int n,m;
cin>>n>>m;
for(int i=0;i<n;i++)
{
per[i]=i;
}
int mp[350][350];
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
mp[i][j]=0;
}
}
for(int i=1;i<=m;i++)
{
int a,b;
cin>>a>>b;
mp[a][b]=1;
}
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
for(int k=0;k<n;k++)
{
if(mp[j][i]&&mp[i][k])
{
mp[j][k]=1;
}
}
}
}
for(int i=0;i<n;i++)
{
for(int j=i+1;j<n;j++)
{
if(mp[i][j]+mp[j][i]==2)
{
per[i]=find(j);
}
}
}
int ans=0;
for(int i=0;i<n;i++)
{
if(per[i]==i)
ans++;
}
cout<<ans<<endl;
}
return 0;
}