时间复杂度O(N*M)
#include<iostream>
using namespace std;
#include<cstring>
int n,m;
int isCon[1005][1005];
int h[1005];
int e[10005];
int ne[10005];
int idx;
int vis[1005];
int ans;
void add(int u,int v)
{
e[idx]=v;
ne[idx]=h[u];
h[u]=idx++;
}
void dfs(int now,int beg)
{
vis[now]=1;
isCon[now][beg]=1; //模拟 有连线 表示两者直接互相存在关系
isCon[beg][now]=1;
int next;
for(int i=h[now];~i;i=ne[i])
{
next=e[i];
if(!vis[next])
{
dfs(next,beg);
}
}
}
int main()
{
cin>>n>>m;
memset(h,-1,sizeof(h));
int u,v;
for(int i=0;i<m;i++)
{
scanf("%d%d",&u,&v);
add(u,v);
}
for(int i=1;i<=n;i++)
{
memset(vis,0,sizeof(vis));
dfs(i,i);
}
int count;
for(int i=1;i<=n;i++)
{
count=0;
for(int j=1;j<=n;j++)
{
if(isCon[i][j])
count++;
}
if(count==n) //如果该顶点和所有顶点都有联系,则ans++
{
ans++;
}
}
cout<<ans;
return 0;
}