zoukankan      html  css  js  c++  java
  • CF1339D-Edge Weight Assignment (dfs)

    题意:

    给你一颗有n个节点的树,让你给每一条边赋一个值,最后要求每对叶子节点之间的简单路径中的边异或和为0,

    问你最少要多少个数最多要多少个数

    链接:https://codeforces.com/contest/1339/problem/D

    思路:

    以一个叶子节点为根跑一遍dfs,先考虑最少需要的数,只要每个叶子节点到根节点的路径数都

    为偶数,那么min为1,反之min为3,例如一个叶子节点到根节点的路径数x为奇数且x>=3,那么

    我们取偶数条路径赋相同的数,剩下3条满足a^b^c=0即可,然后考虑最多要多少个数,假设最多填

    max(max的初值为n-1,即每条边填不同的数)个数,如果一个节点的度数不为1并且他有y个叶子节点,

    那么max就要减y-1,因为这些叶子节点的值必须相同。

    参考博客:https://www.cnblogs.com/limil/p/12690898.html

    代码:

    #include <bits/stdc++.h>
    #define Pair pair<int,int>
    using namespace std;
    typedef long long ll;
    const int MAXN=5e5+5;
    const int INF=1e9;
    int head[MAXN],tot;
    struct node
    {
        int to,nxt;
    } e[MAXN];
    void add(int x,int y)
    {
        e[tot].to=y,e[tot].nxt=head[x],head[x]=tot++;
    }
    void add_edge(int x,int y)
    {
        add(x,y),add(y,x);
    }
    int deg[MAXN],parity[MAXN];
    void dfs(int u,int fa,int p)
    {
        parity[u]=p;
        for(int i=head[u]; ~i; i=e[i].nxt)
        {
            int v=e[i].to;
            if(v!=fa)
                dfs(v,u,p^1);
        }
    }
    int main()
    {
        ios::sync_with_stdio(false);
        cin.tie(0);
        int n;
        cin>>n;
        memset(head,-1,sizeof(head));
        for(int i=1; i<=n-1; i++)
        {
            int x,y;
            cin>>x>>y;
            add_edge(x,y);
            deg[x]++,deg[y]++;
        }
        for(int i=1; i<=n; i++)
        {
            if(deg[i]==1)
            {
                dfs(i,0,0);
                break;
            }
        }
        int max_=n-1,flag=0;
        for(int i=1; i<=n; i++)
        {
            if(deg[i]==1&&parity[i]==1)
            {
                flag=1;
                break;
            }
        }
        for(int i=1; i<=n; i++)
        {
            int dec=0;
            for(int j=head[i]; ~j; j=e[j].nxt)
            {
                int v=e[j].to;
                if(deg[v]==1)
                    dec++;
            }
            if(dec)
                max_-=dec-1;
        }
        cout<<(flag==0?1:3)<<" "<<max_<<endl;
        return 0;
    }
  • 相关阅读:
    [HAOI2015]按位或——Min-Max容斥+FWT
    HDU 4773 Problem of Apollonius——圆反演
    类欧几里得小结
    线性规划(单纯形法)知识整理
    奇怪的数学题(51nod1847)——min_25筛+杜教筛+第二类斯特林数
    CSP-S 2019 游记
    2019.11.11~2019.11.12考试总结
    2019.11.6~2019.11.7考试总结
    1019.11.1~2019.11.2考试总结
    Final-阶段站立会议4
  • 原文地址:https://www.cnblogs.com/ljxdtc666/p/12703203.html
Copyright © 2011-2022 走看看