T2
题目描述
K(1≤K≤100)只奶牛分散在N(1≤N≤1000)个牧场.现在她们要集中起来进餐.
牧场之间有M(1≤M≤10000)条有向路连接,而且不存在起点和终点相同的有向路.
她们进餐的地点必须是所有奶牛都可到达的地方.那么,有多少这样的牧场呢?
牧场之间有M(1≤M≤10000)条有向路连接,而且不存在起点和终点相同的有向路.
她们进餐的地点必须是所有奶牛都可到达的地方.那么,有多少这样的牧场呢?
输入
第1行输入K,N,M.
接下来K行,每行一个整数表示一只奶牛所在的牧场编号.
接下来M行,每行两个整数,表示一条有向路的起点和终点
接下来K行,每行一个整数表示一只奶牛所在的牧场编号.
接下来M行,每行两个整数,表示一条有向路的起点和终点
输出
输出一行,即所有奶牛都可到达的牧场个数。
样例输出
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 }