本题有floyd传递闭包的题,然后判断总数是否等于n-1就行了
floyd:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=100+10;
int n,m1;
int m[maxn][maxn];
void floyd()
{
for(int k=1;k<=n;k++)
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
m[i][j]=(m[i][j]||m[i][k]&&m[k][j]);
}
}
int main()
{
int a,b;
//freopen("H.txt","r",stdin);
memset(m,0,sizeof(m));
scanf("%d %d",&n,&m1);
//cout<<n<<m1<<endl;
for(int i=1;i<=m1;i++)
{
scanf("%d %d",&a,&b);
m[a][b]=1;
}
floyd();
int ans=0,sum;
for(int i=1;i<=n;i++)
{
sum=0;
for(int j=1;j<=n;j++)
{
if(m[i][j]||m[j][i])
sum++;
}
//cout<<sum<<endl;
if(sum==n-1)
ans++;
}
printf("%d\n",ans);
return 0;
}