zoukankan      html  css  js  c++  java
  • A Possible Tree(ICPC2017 Urumqi)

    A Possible Tree

    题目描述

    Alice knows that Bob has a secret tree (in terms of graph theory) with n nodes with n − 1 weighted edges with integer values in [0, 260 −1]. She knows its structure but does not know the specific information about edge weights.
    Thanks to the awakening of Bob’s conscience, Alice gets m conclusions related to his tree. Each conclusion provides three integers u, v and val saying that the exclusive OR (XOR) sum of edge weights in the unique shortest path between u and v is equal to val.
    Some conclusions provided might be wrong and Alice wants to find the maximum number W such that the first W given conclusions are compatible. That is say that at least one allocation of edge weights satisfies the first W conclusions all together but no way satisfies all the first W + 1 conclusions (or there are only W conclusions provided in total).
    Help Alice find the exact value of W.

    输入

    The input has several test cases and the first line contains an integer t (1 ≤ t ≤ 30) which is the number of test cases.
    For each case, the first line contains two integers n (1 ≤ n ≤ 100000) and c (1 ≤ c ≤ 100000) which are the number of nodes in the tree and the number of conclusions provided. Each of the following n−1 lines contains two integers u and v (1 ≤ u, v ≤ n) indicating an edge in the tree between the u-th node and the v-th node. Each of the following c lines provides a conclusion with three integers u, v and val where 1 ≤ u, v ≤ n and val ∈ [0, 260 − 1].

    输出

    For each test case, output the integer W in a single line.

    样例输入

    2
    7 5
    1 2
    2 3
    3 4
    4 5
    5 6
    6 7
    1 3 1
    3 5 0
    5 7 1
    1 7 1
    2 3 2
    7 5
    1 2
    1 3
    1 4
    3 5
    3 6
    3 7
    2 6 6
    4 7 7
    6 7 3
    5 4 5
    2 5 6

    样例输出

    3
    4

    题意:问从前面开始不冲突的个数
      Get 新知识点:带权并查集
      这道题就是带权并查集的模本题啊
      注意 ^ 的优先级 小于 !=
    AC code:
    #include <bits/stdc++.h>
     
    using namespace std;
    typedef long long ll;
    const int N =  1e5 + 10;
    int pre[N];
    ll r[N];
    int n;
    void init()
    {
        for(int i = 1;i <= n;i++)   pre[i] = i,r[i] = 0;
    }
     
    int find(int x)
    {
        if(x == pre[x]) return x;
        int prex = pre[x];
        pre[x] = find(prex);
        r[x] = r[x]^r[prex];
        return pre[x];
    }
     
    int add(int x,int y,ll val)
    {
        int prex = find(x),prey = find(y);
        if(prex == prey)
        {
            if((r[x]^r[y]) != val)
                return 0;
        }
        else
        {
            pre[prex] = prey;
            r[prex] = r[x]^r[y]^val;
        }
        return 1;
    }
    int main()
    {
     
        int t;
        scanf("%d",&t);
        while(t--)
        {
            int m,u,v;
            ll val;
            scanf("%d%d",&n,&m);
            init();
            for(int i = 1;i < n;i++)    scanf("%d%d",&u,&v);
            int ans = m,flag = 0;
            for(int i = 0;i < m;i++)
            {
                scanf("%d%d%lld",&u,&v,&val);
                if(!flag&&!add(u,v,val))
                    ans = i,flag = 1;
            }
            printf("%d
    ",ans);
        }
        return 0;
    }
     




     

  • 相关阅读:
    Triggering effects when a container is resized
    Flex2:无边框透明背景MenuBar实现
    Using the isBranch() method to determine if a Tree item is a branch or leaf
    Flex3 Style 编辑工具
    Displaying a Tree control as a pop up for a Flex PopUpButton control
    Using a CheckBox control as a list item renderer in Flex
    Creating a ControlBar container in Flex using ActionScript
    .NET下的多线程编程4利用thread.Start()传递参数
    委托使用的实例
    算法大全—1冒泡排序法
  • 原文地址:https://www.cnblogs.com/lemon-jade/p/9527952.html
Copyright © 2011-2022 走看看