题意:某人有很多牧场,他的牛在一些牧场中放牧,问有多少牧场所有牛都可以到达。
思路:水题。刚开始用bfs,检测每一个牛所能到达的牧场,但是很遗憾的MLE若干次,故而求助网络,看他们都有的dfs,仅看到一位仁兄用的bfs,但是他用了vector,我不怎么会用,遂改用dfs做,判断到达每个牧场的牛的个数,进行对比是否==k,是牧场数加1,。
#include<iostream> #include<queue> #include<stdio.h> #include<string.h> using namespace std; int cow[1001],vis[1001],cnum[1001],num[1001],map[1001][1001]; int k,n,m; int dfs(int cowNum)//深搜,该牛所能到达的点的牛的个数加1 { vis[cowNum]=1; cnum[cowNum]++; for(int i=0;i<num[cowNum];i++) if(!vis[map[cowNum][i]]) dfs(map[cowNum][i]); } int main() { int s,e,sum; while(scanf("%d%d%d",&k,&n,&m)!=EOF) { sum=0; memset(map,0,sizeof(map)); memset(cnum,0,sizeof(cnum)); memset(num,0,sizeof(num)); for(int i=0;i<k;i++) cin>>cow[i]; for(int i=0;i<m;i++) { cin>>s>>e; map[s][num[s]]=e; num[s]++; } for(int i=0;i<k;i++) { memset(vis,0,sizeof(vis)); dfs(cow[i]); } for(int i=1;i<=n;i++) if(cnum[i]==k) sum++; cout<<sum<<endl; } return 0; }