//cow Picnic 带注释

描述

奶牛正在野餐!每个农民约翰的ķ(1≤ ķ ≤100)奶牛放牧是在一个ñ(1≤ ñ ≤1000)牧场,方便编号为1 ... ñ。草场由连接中号(1≤ 中号 ≤10,000)单向路径(没有路径牧场连接到本身)。

奶牛想要聚集在同一个牧场上野餐,但(由于单向路径),一些奶牛可能只能到达一些牧场。通过确定所有奶牛可以到达多少牧场来帮助奶牛,因此可能是野餐地点。

输入

第1行:三个空格分隔的整数,分别为:KNM 
行2 .. K +1:行i + 1包含一个整数(1 .. N),这是牛的牧场数正在吃草。 
线K +2 .. M + K +1:每条线包含两个以空格分隔的整数,分别为AB(均为1 .. NA!= B),表示从牧场A到牧场B的单向路径。

产量

第1行:单个整数,它是所有奶牛通过单向路径可到达的牧场数量。

样本输入

2 4 4
2
3
1 2
1 4
2 3
3 4

样本输出

2

//cow Picnic
//思路:从k个奶牛分别dfs,
//用mk[i]表示第i个牧场被遍历过多少次,
//最后只有mk[i]==k的牧场满足条件。无权的有向图用vector存储。 
#include<iostream>
#include<vector>
#include<cstdio>
using namespace std;
int a[1001],mk[1001];
vector<int> b[1001];//定义2维度数组放入vector容器、 
int k,n,m;
int vis[1001];
void dfs(int x)
{
    vis[x]=1;//标记已到达 
    mk[x]++;
    for(int i=0;i<b[x].size();i++)//当前数组不为空时循环 
    {
        if(!vis[b[x][i]])
        {
             dfs(b[x][i]);
        }
    }

int main()
{
    int x,y;
    cin>>k>>n>>m;
    for(int i=1;i<=k;i++)
    {
        cin>>a[i];
    }
    for(int i=1;i<=m;i++)
    {
        cin>>x>>y;
        b[x].push_back(y);//在b[x]的结尾添加y元素 
    }
    for(int i=1;i<=k;i++)//循环次数为牛的个数。
    {
        for(int j=1;j<=n;j++) vis[j]=0;//每次循环每次都初始化标记  
        dfs(a[i]);
    }
    int ans=0;
    for(int i=1;i<=n;i++) 
    {
        if(mk[i]==k) ans++;//如果这个地方所有的牛都能来符合条件所以ans++ 
    }
        cout<<ans<<endl;
    return 0;
}


 

猜你喜欢

转载自blog.csdn.net/wwwkm123/article/details/81451432