zoukankan      html  css  js  c++  java
  • 【33.33%】【codeforces 681D】Gifts by the List

    time limit per test1 second
    memory limit per test256 megabytes
    inputstandard input
    outputstandard output
    Sasha lives in a big happy family. At the Man’s Day all the men of the family gather to celebrate it following their own traditions. There are n men in Sasha’s family, so let’s number them with integers from 1 to n.

    Each man has at most one father but may have arbitrary number of sons.

    Man number A is considered to be the ancestor of the man number B if at least one of the following conditions is satisfied:

    A = B;
    the man number A is the father of the man number B;
    there is a man number C, such that the man number A is his ancestor and the man number C is the father of the man number B.
    Of course, if the man number A is an ancestor of the man number B and A ≠ B, then the man number B is not an ancestor of the man number A.

    The tradition of the Sasha’s family is to give gifts at the Man’s Day. Because giving gifts in a normal way is boring, each year the following happens.

    A list of candidates is prepared, containing some (possibly all) of the n men in some order.
    Each of the n men decides to give a gift.
    In order to choose a person to give a gift to, man A looks through the list and picks the first man B in the list, such that B is an ancestor of A and gives him a gift. Note that according to definition it may happen that a person gives a gift to himself.
    If there is no ancestor of a person in the list, he becomes sad and leaves the celebration without giving a gift to anyone.
    This year you have decided to help in organizing celebration and asked each of the n men, who do they want to give presents to (this person is chosen only among ancestors). Are you able to make a list of candidates, such that all the wishes will be satisfied if they give gifts according to the process described above?

    Input
    In the first line of the input two integers n and m (0 ≤ m < n ≤ 100 000) are given — the number of the men in the Sasha’s family and the number of family relations in it respectively.

    The next m lines describe family relations: the (i + 1)th line consists of pair of integers pi and qi (1 ≤ pi, qi ≤ n, pi ≠ qi) meaning that the man numbered pi is the father of the man numbered qi. It is guaranteed that every pair of numbers appears at most once, that among every pair of two different men at least one of them is not an ancestor of another and that every man has at most one father.

    The next line contains n integers a1, a2, …, an (1 ≤ ai ≤ n), ith of which means that the man numbered i wants to give a gift to the man numbered ai. It is guaranteed that for every 1 ≤ i ≤ n the man numbered ai is an ancestor of the man numbered i.

    Output
    Print an integer k (1 ≤ k ≤ n) — the number of the men in the list of candidates, in the first line.

    Print then k pairwise different positive integers not exceeding n — the numbers of the men in the list in an order satisfying every of the men’s wishes, one per line.

    If there are more than one appropriate lists, print any of them. If there is no appropriate list print  - 1 in the only line.

    Examples
    input
    3 2
    1 2
    2 3
    1 2 1
    output
    -1
    input
    4 2
    1 2
    3 4
    1 2 3 3
    output
    3
    2
    1
    3
    Note
    The first sample explanation:

    if there would be no 1 in the list then the first and the third man’s wishes would not be satisfied (a1 = a3 = 1);
    if there would be no 2 in the list then the second man wish would not be satisfied (a2 = 2);
    if 1 would stay before 2 in the answer then the second man would have to give his gift to the first man, but he wants to give it to himself (a2 = 2).
    if, at the other hand, the man numbered 2 would stay before the man numbered 1, then the third man would have to give his gift to the second man, but not to the first (a3 = 1).

    【题解】

    题意:
    每个人都有一个想要送礼物的对象(自己的祖先中的某个人)。但是每个人送礼物的时候都会从上往下看一张你要制作的表。每个人一发现有自己的祖先马上就会把礼物送出去->表的不同就决定了能不能把礼物送给自己想要的人。
    做法:
    dfs;
    —for son of u
    ——-if (wanted[son]!=wanted[u] && wanted[son]!=son)
    ———–noans = true,puts(“-1”);
    ——-dfs(son);
    -if (wanted[u]==u)
    ——将u放在序列的开头;
    想想就能明白的。
    相当于每个子树的儿子都只能给这个子树的根节点;(wanted[x]==x,则以x为根节点划分一个新的子树,上面部分和下面部分独立);输出的时候先输出下面的子树的根节点。这样就不会对上面的子树造成干扰;

    #include <cstdio>
    #include <vector>
    
    using namespace std;
    
    const int MAXN = 1e5 + 10;
    
    int n, m, fa[MAXN] = { 0 };
    int wanted[MAXN];
    vector <int> a[MAXN];
    vector <int> ans;
    bool noans = false;
    
    void dfs(int x)
    {
        int len = a[x].size();
        for (int i = 0; i <= len - 1; i++)
        {
            int y = a[x][i];
            if (wanted[y] != wanted[x] && wanted[y] != y)
            {
                noans = true;
                return;
            }
            dfs(y);
            if (noans)
                return;
        }
        if (wanted[x] == x)
            ans.push_back(x);
    }
    
    int main()
    {
        //freopen("F:\rush.txt", "r", stdin);
        scanf("%d%d", &n, &m);
        for (int i = 1; i <= m; i++)
        {
            int x, y;
            scanf("%d%d", &x, &y);
            a[x].push_back(y);
            fa[y] = x;
        }
        for (int i = 1; i <= n; i++)
            scanf("%d", &wanted[i]);
        for (int i = 1; i <= n; i++)
            if (fa[i] == 0)
            {
                dfs(i);
                if (noans)
                {
                    puts("-1");
                    return 0;
                }
            }
        int len = ans.size();
        printf("%d
    ", len);
        for (int i = 0; i <= len - 1; i++)
            printf("%d
    ", ans[i]);
        return 0;
    }
  • 相关阅读:
    mysql 设置密码
    linux 下如何抓取HTTP流量包(httpry)
    m2a-vm超频的方法
    生产服务器环境最小化安装后 Centos 6.5优化配置备忘
    CentOS关闭休眠和屏保模式
    微信公众平台开发教程第2篇-----微信开发者接入
    微信公众平台开发教程第1篇-新手解惑
    android 文件读取(assets、raw)
    员工培训的七大误区和三个内核价值
    从业务专家进阶到管理者
  • 原文地址:https://www.cnblogs.com/AWCXV/p/7632131.html
Copyright © 2011-2022 走看看