Ehab and Path-etic MEXs图论思维题

传送门:https://codeforces.ml/contest/1325/problem/C

题意:

  给你一个n个节点n-1条边的无向图,要求你要给每条边赋值,取值在0到n-2之间,要求给出一种构造方式,使每两对节点之间简单路径的边值组成的序列的mex值之和最小。

思路:

  对于一条链来说(所以节点的度<=2),无论怎么赋值,mex的长度都超过了n-2,但当出现一个节点的度>=3时,我们就可以把0,1,2分配给那个节点的三条边,这样任意两对的节点的mex永远不会超过2,因为无论怎么连都无法同时取到这三个数,总值也就最小了。

ac代码:顺带一提pair类型的max函数默认先比较第一个值,若相等再比较第二个值。

#include<iostream>
#include<vector>
using namespace std;
const int maxn=1e5+5;
typedef pair<int,int> paa;
vector<int> ve[maxn];
int n,v,u;
int ans[maxn];
int main()
{
    cin>>n;
    for(int i=1;i<=n-1;i++){
        cin>>u>>v;
        ve[u].push_back(i);
        ve[v].push_back(i);
        ans[i]=-1;
    }
    paa mx={0,0};
    for(int i=1;i<=n;i++)
        mx=max(mx,paa{(int)ve[i].size(),i});
    int cnt=0;
    for(auto x:ve[mx.second]){
        ans[x]=cnt++;
    }
    for(int i=1;i<n;i++){
        if(ans[i]==-1){
            ans[i]=cnt++;
        }
        cout<<ans[i]<<'
';
    }
    return 0;
}
原文地址:https://www.cnblogs.com/qq2210446939/p/12503583.html