Codeforces681D Gifts by the List
题意:一个家族有n个人,m种关系,之后行有 x y ,表示 x 是 y 的祖先,祖先具有传递性,然后有n个数,表示第 i 个人想把礼物送给 a[i],
你需要构造一张表这张表上的人代表收礼物的人,并且其他人送礼物是按表上的顺序找,找到的第一个祖先就是他要送礼的人,同时需要满足这个人
是他想送礼的人,如果存在这张表输出人数及编号,否则输出-1(题意中自己也算是自己的一个祖先)
题解:可以发现,a向b送礼,a != b:a的祖先只能给b送礼 a == b就没有限制
#include <bits/stdc++.h> #define maxn 100010 #define INF 0x3f3f3f3f using namespace std; vector<int >G[maxn], ans; int val[maxn], n, m, a, b, in[maxn]; void dfs(int x,int fa){ for(int u:G[x]) dfs(u, x); if(val[x] == x) ans.push_back(x); else if(val[x] != val[fa]){ printf("-1\n"); exit(0); } } int main(){ scanf("%d%d", &n, &m); for(int i=0;i<m;i++){ scanf("%d%d", &a, &b); G[a].push_back(b); in[b]++; } int num = 1; for(int i=1;i<=n;i++) scanf("%d", &val[i]); for(int i=1;i<=n;i++) if(in[i] == 0) dfs(i, 0); printf("%d\n", ans.size()); for(auto j:ans) printf("%d\n", j); return 0; }
posted on 2018-04-15 23:10 2855669158 阅读(178) 评论(0) 编辑 收藏 举报