3045: 【普及/提高-】【P2853】Cow Picnic S
内存限制:128 MB
时间限制:1.000 S
评测方式:文本比较
命题人:
提交:7
解决:2
题目描述
只奶牛分散在 个牧场.现在她们要集中起来进餐。牧场之间有 条有向路连接,而且不存在起点和终点相同的有向路.她们进餐的地点必须是所有奶牛都可到达的地方。那么,有多少这样的牧场可供进食呢?
输入
Line 1: Three space-separated integers, respectively: K, N, and M
Lines 2..K+1: Line i+1 contains a single integer (1..N) which is the number of the pasture in which cow i is grazing.
Lines K+2..M+K+1: Each line contains two space-separated integers, respectively A and B (both 1..N and A != B), representing a one-way path from pasture A to pasture B.
输出
Line 1: The single integer that is the number of pastures that are reachable by all cows via the one-way paths.
样例输入 复制
2 4 4
2
3
1 2
1 4
2 3
3 4
样例输出 复制
2
提示
#include<bits/stdc++.h> using namespace std; #define MAXK 110 #define MAXN 1010 vector <int> p[MAXN]; bool u[MAXN]; int k,n,m,ans=0,f[MAXN],a[MAXK]; void dfs(int x) { for (int i = 0, sz = p[x].size(); i < sz ; i++) { if (!u[p[x][i]]) { u[p[x][i]] = true; f[p[x][i]]++; dfs(p[x][i]); } } } void bfs(int x) { queue<int> q; q.push(x); while(!q.empty()) { x=q.front(); q.pop(); for (int i = 0, sz = p[x].size(); i < sz ; i++) { if (!u[p[x][i]]) { u[p[x][i]] = true; f[p[x][i]]++; q.push(p[x][i]); } } } } int main(){ cin >> k >> n >> m; for (int i = 1; i <= k; i++) cin >> a[i]; for (int i = 1; i <= m; i++) { int x,y; cin >> x >> y; p[x].push_back(y); } for (int i = 1; i <= k; i++) { memset(u,0,sizeof(u)); u[a[i]] = true; f[a[i]]++; bfs(a[i]); } for (int i = 1; i<=n ; i++) if (f[i] == k ) ans++; cout << ans << endl; return 0; }