思路:
1.正着存一个图,再把边的方向倒过来再存一个图;
2.对于每个点,dfs正着的那个图,再dfs倒着的那个图,分别设立两个数组标记每个点是否被访问,如果有点两次都没有被访问,则该点不能知道所有点;
3.刚开始想错了,想着正着要遍历到所有点或者倒着要遍历到所有点才行,这样才30分,而且觉得自己很对,30分的朋友可以康康是不是这个错QAQ;
代码:
#define IOS ios::sync_with_stdio(false);cin.tie(0)
#include<bits/stdc++.h>
using namespace std;
#define mem(a,x) memset(a,x,sizeof(a))
#define pb(a) push_back(a)
#define rp(i,n) for(int i=0;i<n;i++)
#define rpn(i,n) for(int i=1;i<=n;i++)
const int MAX_N=1005;
vector<int> v[2][MAX_N];
bool vst[2][MAX_N];
void dfs(int now,int k){
vst[k][now]=true;
for(auto e:v[k][now]){
if(!vst[k][e]) dfs(e,k);
}
}
int main(){
IOS;
int n,m;
cin>>n>>m;
rp(i,m){
int a,b;
cin>>a>>b;
v[0][a].pb(b);
v[1][b].pb(a);
}
int ans=0;
for(int i=1;i<=n;i++){
mem(vst,0);
for(int k=0;k<2;k++) dfs(i,k);
rpn(j,n){
if(vst[0][j]==0&&vst[1][j]==0) goto here;
}
ans++;
here:;
}
cout<<ans;
return 0;
}