首页 > 其他 > 详细

vj-E题Ehab and Path-etic MEXs

时间:2020-06-15 09:06:28      阅读:57      评论:0      收藏:0      [点我收藏+]

Ehab and Path-etic MEXs

题意:给定一棵树所有的边,对所有的边进行标号,询问任意两点Mex的最大值最小的的标号方案(输出任何一种)。

Mex(u,v)表示从u到v的简单路径中没有出现的最小标号。

思路:(借鉴大佬的)

如果树是一条链,那么任何标号方案对首尾两端的 技术分享图片 都不会影响,直接输出 技术分享图片 到 技术分享图片即可;

其余情况可以证明 技术分享图片 最大值的最小值一定为 技术分享图片 :

(1)无论如何安排,标 技术分享图片 边和标 技术分享图片 边一定存在公共路径联通;

(2)对于非链的树一定存在 技术分享图片 , 技术分享图片 的安排方式使得存在边不在技术分享图片, 技术分享图片的任何公共路径上。在该边上标 技术分享图片 即可满足不存在技术分享图片技术分享图片技术分享图片的公共路径。

有两种比较简洁的实现方式:

(1)找到三个度为 技术分享图片 的点,选取这三个点的临边,标为技术分享图片技术分享图片技术分享图片,其余任意;

(2)找到一个度大于等于 技术分享图片 的点,选取它的三个临边。

#include<bits/stdc++.h>
const int maxn= 1e5+100;
using namespace std;
int a[maxn],b[maxn],num[maxn];
int main()
{
    int n;
    scanf("%d",&n);
    for(int i=1;i<n;i++)
    {
        scanf("%d%d",&a[i],&b[i]);
        num[a[i]]++;num[b[i]]++;
    }
    int op = 0;
    for(int i=1;i<=n;i++) if(num[i]>=3) {op = i; break;}
    if(!op) for(int i=0;i<n-1;i++) printf("%d\n",i);
    else
    {
        for(int i=1,cnt1=0,cnt2=3;i<n;i++)
        {
            if((a[i]==op || b[i]==op) && cnt1<=2) printf("%d\n",cnt1++);
            else printf("%d\n",cnt2++);
        }
    }
    return 0;
}

 

vj-E题Ehab and Path-etic MEXs

原文:https://www.cnblogs.com/mxw000120/p/13128517.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!