Cow Picnic

题意:某人有很多牧场,他的牛在一些牧场中放牧,问有多少牧场所有牛都可以到达。

思路:水题。刚开始用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;
}


 

你可能感兴趣的:(Cow Picnic)