zoukankan      html  css  js  c++  java
  • Codeforces Round #633 (Div. 2) D.Edge Weight Assignment

    D.Edge Weight Assignment

    题目链接

    题目概述

    大致意思就是给一颗树,让你构造边权,使得所有叶子节点两两间的距离(“距离”定义为(u,v)之间边权的异或和)为0。

    For every two different leaves v1 and v2 of this tree, bitwise XOR of weights of all edges on the simple path between v1 and v2 has to be equal to 0.

    问,所用不同权值个数的最大与最小值。
    边权的取值范围是([1,+infty])

    思路

    对于最小值
    我们发现,如果所有叶子节点两两间的距离是偶数,那么最小值就是(1),否则就是(3)

    对于最大值
    注意到,其实样例给了很好的思路。在样例的图中如果一个点有(geq2)个叶子节点,那么这些边的权值相同。

    这启示我们可以把这些节点合并,减少的边数也就是该点的叶子节点数(-1)

    合并后就是若干条链相交的情况,第三组样例同样告诉我们剩余所有边可以填成不同的值。

    最后判断叶子节点两两间的距离的奇偶性:

    从任意一个点出发染色,判断所有叶子的颜色是否相同。

    代码:

    #include "iostream"
    #include "stdio.h"
    #include "string.h"
    #include "algorithm"
    using namespace std;
    typedef long long ll;
    typedef unsigned long long ull;
    typedef pair<int,int> pii;
    const int N=1e6+5;
    const ll mod=998244353;
    const double eps=1e-5;
    //const double pi=acos(-1);
    
    #define ls p<<1
    #define rs p<<1|1
    int c[N],deg[N];
    vector<int>g[N];
    void dfs(int u,int col)
    {
        c[u]=col;
        for(auto v:g[u])
        {
            if(c[v]) continue;
            dfs(v,3-col);
        }
    }
    int main()
    {
    #ifndef ONLINE_JUDGE
        freopen("in.txt", "r", stdin);
    #endif
        ios::sync_with_stdio(false);
        cin.tie(0);
        int n;
        cin>>n;
        for(int i=1;i<n;i++)
        {
            int u,v;
            cin>>u>>v;
            g[u].push_back(v);
            g[v].push_back(u);
            deg[u]++,deg[v]++;
        }
        for(int i=1;i<=n;i++)
            if(deg[i]==1)
                c[g[i][0]]++;
        int a=1,b=n-1;
        for(int i=1;i<=n;i++)
            b-=max(0,c[i]-1);
        memset(c,0,sizeof c);
        dfs(1,1);
        int f=0;
        for(int i=1;i<=n;i++)
        {
            if(deg[i]==1)
            {
                if(c[i]==1) f|=1;
                else f|=2;
            }
        }
        if(f==3) a=3;
        cout<<a<<' '<<b<<endl;
        return 0;
    }
    
  • 相关阅读:
    Remmina:一个 Linux 下功能丰富的远程桌面共享工具(转载)
    Linux安装多功能词典GoldenDict
    Ubuntu18.04 更改GRUB引导菜单背景图片和默认启动项
    ubuntu 18.04网卡命名规则改回传统的ethx
    Linux Putty 复制粘贴
    Ubuntu 18.04图形化软件包管理器
    Ubuntu 18.04 安装 Broadcom Limited BCM43142无线网卡驱动
    Linux下通过rdesktop连接Windows远程桌面
    Debian9.5 系统配置NFS配置说明
    CentOS6.9下NFS配置说明
  • 原文地址:https://www.cnblogs.com/Suiyue-Li/p/12691025.html
Copyright © 2011-2022 走看看