博客园 首页 私信博主 显示目录 隐藏目录 管理 动画

T2

题目描述

K(1≤K≤100)只奶牛分散在N(1≤N≤1000)个牧场.现在她们要集中起来进餐. 
牧场之间有M(1≤M≤10000)条有向路连接,而且不存在起点和终点相同的有向路. 
她们进餐的地点必须是所有奶牛都可到达的地方.那么,有多少这样的牧场呢? 

输入

第1行输入K,N,M.  
接下来K行,每行一个整数表示一只奶牛所在的牧场编号. 
接下来M行,每行两个整数,表示一条有向路的起点和终点 

输出

输出一行,即所有奶牛都可到达的牧场个数。

样例输入

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

样例输出

2
老师的作业还是一如既往的水,从数据来看这怎么都不能爆搜啊,然而还真过了,这个高考期间的作业,不想吐槽
 1 #include<iostream>
 2 #include<cstring>
 3 using namespace std;
 4 const int maxn=1e6+10;
 5 int n,m,k,ans;
 6 struct node
 7 {
 8     int next;
 9     int to;
10 }way[maxn];
11 int tot=0;
12 bool vis[maxn];
13 int c[maxn];
14 int deep[maxn];
15 int head[maxn];
16 int add(int x,int to)
17 {
18     way[++tot].next=head[x];
19     way[tot].to=to;
20     head[x]=tot;
21 }
22 int dfs(int x)
23 {
24     deep[x]++;
25     vis[x]=1;
26     for(int i=head[x];i;i=way[i].next)
27     {
28         if(!vis[way[i].to])
29         {
30             dfs(way[i].to);
31         }
32     }
33 }
34 int main()
35 {
36     cin>>k>>n>>m;
37     memset(head,0,sizeof(head));
38     for(int i=1;i<=k;i++)
39     {
40         cin>>c[i];
41     }
42     for(int i=1;i<=m;i++)
43     {
44         int g,h;
45         cin>>g>>h;
46         add(g,h);
47     }
48     for(int i=1;i<=k;i++)
49     {
50         memset(vis,0,sizeof(vis));
51         dfs(c[i]);
52     }
53     for(int i=1;i<=n;i++)
54     {
55         if(deep[i]==k)
56         {
57             ans++;
58         }
59     }
60     cout<<ans<<endl;
61     return 0;    
62 }

 

 
posted @ 2019-06-07 11:10  2529102757  阅读(80)  评论(0编辑  收藏  举报