传送门: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]<<‘\n‘; } return 0; }
原文地址:https://www.cnblogs.com/qq2210446939/p/12503583.html
时间: 2024-10-20 19:17:34