C. Ehab and Path-etic MEXs--------------思维

在这里插入图片描述
在这里插入图片描述

题意:
给定一棵树,有n个节点,现在为每个节点所在的边编号为0~n-2.问你怎样编号使得树上任意两点u,v的最大mex(u,v)值最小

mex(u,v)是指树上从u到v的一条简单路径上第一个没有出现的数字
假设这条路径有1,2,3,4 那么第一个没有出现的就是0

解析:
假如这棵树是一条链的话,随便排,全链路径的MEX一定为n−1

现在换成一棵树,如果存在某个节点度数>=3,选择和该节点相连的边依次赋值0,1,2,3…。这样就不可能存在其他路径同时经过0,1,2,3…但是无论怎么排列,一定存在一条路径经过0,1.所以所有路径的MEX的最小值一定为2。其他的随便排。


#include<bits/stdc++.h>
using namespace std;
#define x first
#define y second
const int N=1e5;
vector<pair<int,int> > g[N];
int ans[N];
int n;
int main()
{
	cin>>n;
	for(int i=1;i<=n-1;i++)
	{
		int u,v;
		cin>>u>>v;
		g[u].push_back(make_pair(v,i));
		g[v].push_back(make_pair(u,i));
	}
	int cnt=1;
	for(int i=1;i<=n;i++)
	{
		if(g[i].size()>2)
		{
			for(auto j:g[i])
			{
				ans[j.y]=cnt++;
			}
			break;
		}
	}
	for(int i=1;i<=n-1;i++)
	{
		if(ans[i]==0) ans[i]=cnt++;
		cout<<ans[i]-1<<endl;
	}
 } 
发布了491 篇原创文章 · 获赞 11 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_43690454/article/details/104878070
今日推荐