Codeforces Round #357 (Div. 2) D. Gifts by the List

来源:互联网 发布:mac的mission control 编辑:程序博客网 时间:2024/09/21 09:21

题意

给你一个森林

然后给你每个人想要给谁礼物的意愿

这些人给礼物是根据一个列表,他们会从上往下看,看到第一个是他祖先的人,就会给这个人礼物

你需要构造一个列表,满足所有人的意愿。

题解:

直接dfs

如果这个人的意愿不是他自己,或者这个人的意愿和他的父亲不同的话,那么就输出无解,因为这样必然会和他的父亲发生冲突。

为什么呢?

如果a要给b礼物,那么a和b之间的所有人,都必须给b礼物。

答案的话,按照dfs顺序倒序输出就好了

#include <set>#include <map>#include <stack>#include <queue>#include <deque>#include <cmath>#include <vector>#include <string>#include <cstdio>#include <cstdlib>#include <cstring>#include <iostream>#include <algorithm>using namespace std;#define L(i) i<<1#define R(i) i<<1|1#define INF  0x3f3f3f3f#define pi acos(-1.0)#define eps 1e-9#define maxn 100100#define MOD 1000000007struct Edge{    int to,next;}edge[maxn];int n,m;int fa[maxn],dep[maxn];int tot,head[maxn],flag;vector<int> ans;void init(){    tot = 0;    memset(head,-1,sizeof(head));}void add_edge(int u,int v){    edge[tot].to = v;    edge[tot].next = head[u];    head[u] = tot++;}void dfs(int u){    for(int i = head[u]; i != -1; i = edge[i].next)    {        int v = edge[i].to;        if(fa[v] != fa[u] && fa[v] != v)            flag = 0;        dfs(v);    }    if(fa[u] == u)        ans.push_back(u);}int main(){    int t,C = 1;    //scanf("%d",&t);    while(scanf("%d%d",&n,&m) != EOF)    {        init();        memset(dep,0,sizeof(dep));        for(int i = 0; i < m; i++)        {            int u,v;            scanf("%d%d",&u,&v);            add_edge(u,v);            dep[v]++;        }        for(int i = 1; i <= n; i++)            scanf("%d",&fa[i]);        flag = 1;        ans.clear();        for(int i = 1; i <= n; i++)            if(!dep[i])                dfs(i);        if(!flag)            printf("-1\n");        else        {            printf("%d\n",ans.size());            for(int i = 0; i < ans.size(); i++)                printf("%d\n",ans[i]);        }    }    return 0;}


0 0
原创粉丝点击