P2853 [USACO06DEC]牛的野餐Cow Picnic
-------------------------
长时间不写代码了,从学校中抽身出来真的不容易啊
------------------------
链接:Miku
-----------------------
这道题的思路就在于建反图,如果每一头牛都能到达的话,那么在反图上,这个点也一定能到达每一头牛。
那么我们的目的就明确了,找到所有能在反图上找到每一头牛的点。
-----------------------
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<iostream> #include<cstdio> #include<cstring> using namespace std; int p; int head[1001]; int f; struct b{ int ne; int to; } e[10005]; int k,n,m; int con; int cow[1001]; int x,y; int ans; int sum; int vis[1001]; void add(int f,int t){ p++; e[p].ne=head[f]; e[p].to=t; head[f]=p; } void dfs( int now){ if(vis[now]||f) return ; vis[now]=1; sum+=cow[now]; if(sum==k){ f=1; return ; } for(int i=head[now];i;i=e[i].ne){ int v=e[i].to; dfs(v); } return ; } int main(){ cin>>k>>n>>m; for(int i=1;i<=k;++i){ cin>>x; cow[x]++; } for(int i=1;i<=m;++i){ cin>>y>>x; add(x,y); } for(int i=1;i<=n;++i){ f=0; sum=0; memset(vis,0,sizeof(vis)); dfs(i); if(f) ans++; } cout<<ans; return 0; }