题解:一个一个点进行正反bfs得出答案即可
附上代码:
#include<iostream>
#include<cstdio>
#include<vector>
#include<cstring>
#include<queue>
using namespace std;
const int maxn=1e3+50;
int n,m;
vector<int>g[maxn],g0[maxn];
int vis[maxn],vis0[maxn];
queue<int>q;
int main()
{
scanf("%d%d",&n,&m);
int u,v;
for(int i=0;i<m;i++){
scanf("%d%d",&u,&v);
g[u].push_back(v);
g0[v].push_back(u);
}
int ans=0;
for(int i=1;i<=n;i++){
memset(vis,0,sizeof(vis));
memset(vis0,0,sizeof(vis0));
q.push(i);
vis[i]=1;
while(!q.empty()){
int u=q.front();
q.pop();
int l=g[u].size();
for(int j=0;j<l;j++){
int to=g[u][j];
if(!vis[to]){
q.push(to);
vis[to]=1;
}
}
}
q.push(i);
vis0[i]=1;
while(!q.empty()){
int u=q.front();
q.pop();
int l=g0[u].size();
for(int j=0;j<l;j++){
int to=g0[u][j];
if(!vis0[to]){
q.push(to);
vis0[to]=1;
}
}
}
int cnt=0;
for(int k=1;k<=n;k++){
if(vis[k]||vis0[k]){
cnt++;
}
}
if(cnt==n){
ans++;
}
}
printf("%d\n",ans);
return 0;
}