【CCF】通信网络 简单搜索
去重!不然有环就直接挂掉了...0分
#include<iostream> #include<cstdio> #include<string> #include<cstring> #include<algorithm> #include<vector> #include<queue> using namespace std; typedef long long ll; const int maxn=1e3+2; const int maxm=1e4+2; int n,m; bool vis[maxn][maxn]; struct edge{ int to; int nxt; }e[maxm]; int head[maxn]; int tot=0; void init(){ memset(head,-1,sizeof(head)); tot=0; } void add(int u,int v){ e[tot].to=v; e[tot].nxt=head[u]; head[u]=tot++; } void dfs(int fa,int u){ for(int i=head[u];i!=-1;i=e[i].nxt){ int v=e[i].to; if(vis[fa][v]) continue; vis[fa][v]=true; dfs(fa,v); } } int work(){ memset(vis,false,sizeof(vis)); for(int i=1;i<=n;i++) vis[i][i]=true; for(int i=1;i<=n;i++){ dfs(i,i); } // for(int i=1;i<=n;i++){ // for(int j=1;j<=n;j++){ // cout<<vis[i][j]<<" "; // } // cout<<endl; // } int ans=0; for(int i=1;i<=n;i++){ int cnt=1; for(int j=1;j<=n;j++){ if(i==j) continue; if(vis[i][j]) cnt++; else if(vis[j][i]) cnt++; } if(cnt==n) ans++; } return ans; } int main(){ while(~scanf("%d%d",&n,&m)){ init(); int u,v; for(int i=1;i<=m;i++){ scanf("%d%d",&u,&v); add(u,v); } int ans=work(); printf("%d\n",ans); } return 0; }