POJ 3256 Cow Picnic

题目链接:http://poj.org/problem?id=3256

/*
对每个有牛的草地,都进行dfs,沿着所有的有向边,标记所有经过的草地,经过草地时,草地i的属性visited[i]++,
若存在草地的visited[i]==K,则说明所有的K只牛都能到达此地

cow[i]指的是第i只牛所在的草地

存储路径可以使用邻接表

*/
#include<iostream>
#include<queue>
using namespace std;


int k,n,m;
int head[1001];
int x,y;
int cow[101];
int result;
int visit[1001];
int mark[1001];

//邻接表
struct node{
    int u,v;
    int next;
}edge[10001];

void dfs(int x){       //对第i个草地进行dfs

    visit[x]++;
    mark[x]=1;
    int cur=head[x];
    while(cur!=-1)
    {
        if(mark[edge[cur].v]==0)
            dfs(edge[cur].v);
        cur=edge[cur].next;
    }
}

int main (){

    while(cin>>k>>n>>m){

        memset(visit,0,sizeof(visit));
        for(int i=0;i<k;i++)
            cin>>cow[i];

        memset(head,-1,sizeof(head));
        for(int i=0;i<m;i++)
        {
            cin>>x>>y;
            edge[i].u=x;
            edge[i].v=y;
            edge[i].next=head[x];
            head[x]=i;
        }

        for(int i=0;i<k;i++)
        {
            memset(mark,0,sizeof(mark));
            dfs(cow[i]);
        }

        result=0;

        for(int i=1;i<=n;i++)
        {
            if(visit[i]==k)
                result++;
            //cout<<visit[i];
        }
        cout<<result<<endl;
    }
    return 0;
}
原文地址:https://www.cnblogs.com/neverchanje/p/3536990.html