思路:找标每个点能到达的点,最后统计一下。
#include <cstdio>
#include <vector>
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long LL;
const int MAXN=1005;
bool vis[MAXN][MAXN];
bool visit[MAXN];
vector <int>G[MAXN];
void dfs(int cur, int st)
{
visit[cur]=true;
vis[st][cur]=vis[cur][st]=true;
for(int i=0;i<G[cur].size();++i)
{
if(!visit[G[cur][i]])
dfs(G[cur][i], st);
}
return ;
}
int main()
{
int n, m;
scanf("%d %d", &n, &m);
for(int i=1;i<=m;++i)
{
int u, v;
scanf("%d %d", &u, &v);
G[u].push_back(v);
}
for(int i=1;i<=n;++i)
{
memset(visit, false, sizeof(visit));
dfs(i, i);
}
int ans=0;
for(int i=1;i<=n;++i)
{
for(int j=1;j<=n;++j)
{
if(!vis[i][j])
break;
if(j==n)
ans++;
}
}
printf("%d\n", ans);
return 0;
}