• 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;
    }
    
  • 相关阅读:
    有关css的效果展示
    php将代码上传至服务器步骤
    php连接数据库
    PHP如何从一个页面跳转到另一个页面
    Windows计算器
    查询本地正在运行的端口号
    wamp虚拟路径访问配置
    sublime text3 Emmet (原zenCoding)安装方法
    Latex(一)公式自动编号与自动引用
    Linux下Django开发学习(一)
  • 原文地址:https://www.cnblogs.com/Suiyue-Li/p/12691025.html
Copyright © 2020-2023  润新知