定义r[u][v] 表示 u -> v,在DFS中标识即可,这是一个双向的。dfs(u, e[v][i]) // u不变,v变!
#include<bits/stdc++.h>#define ll long long#define INF 0x3f3f3f3f
using namespace std;constint maxn =1e3+24;int n, m, ans =0;
bool r[maxn][maxn], vis[maxn];
vector <int> e[maxn];voidread(){
cin >> n >> m;for(int i =0; i < m;++i){
int u, v;
cin >> u >> v;
e[u].push_back(v);}}voiddfs(int u,int v)//u为当前查找的点,v为直接或间接与u相连通的点{
r[u][v]= true;//u可以访问到v
r[v][u]= true;//v可以访问到u
vis[v]= true;for(int i =0; i < e[v].size();++i)if(!vis[e[v][i]])dfs(u, e[v][i]);}voidsolve(){
for(int i =1; i <= n;++i){
memset(vis,0,sizeof(vis));dfs(i, i);//搜索每个点,从自身开始查找}for(int i =1; i <= n;++i){
int cnt =0;for(int j =1; j <= n;++j)if(r[i][j])
cnt++;if(cnt == n)
ans++;}
cout << ans;}intmain(){
read();solve();return0;}