描述
奶牛正在野餐!每个农民约翰的ķ(1≤ ķ ≤100)奶牛放牧是在一个ñ(1≤ ñ ≤1000)牧场,方便编号为1 ... ñ。草场由连接中号(1≤ 中号 ≤10,000)单向路径(没有路径牧场连接到本身)。
奶牛想要聚集在同一个牧场上野餐,但(由于单向路径),一些奶牛可能只能到达一些牧场。通过确定所有奶牛可以到达多少牧场来帮助奶牛,因此可能是野餐地点。
输入
第1行:三个空格分隔的整数,分别为:K,N和M
行2 .. K +1:行i + 1包含一个整数(1 .. N),这是牛我的牧场数正在吃草。
线K +2 .. M + K +1:每条线包含两个以空格分隔的整数,分别为A和B(均为1 .. N和A!= 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;
}