Codeforces Round #637 (Div. 2)

参考博客:https://blog.csdn.net/qq_45458915/article/details/105730195
构造nb

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long LL;
typedef unsigned long long ull;
const int inf=0x3f3f3f3f;
const int N=2e5+100;
vector<int>node[N];
vector<pair<int,int>>ans;
int mmax;
//1 -1 0
void dfs(int u,int fa,int t)//在区间 [ mmax - son - 1 , mmax ] 内赋值
{
	int temp=t;
	//					1 0
	//从父节点下来 
	ans.push_back(make_pair(u,t));
	int son=node[u].size()-(u!=1);//有多少个子节点
	for(auto v:node[u])
	{
		if(v==fa)
			continue;
		if(t==mmax)//如果已经到最大值了,那么切换成最小值
		{
			t=mmax-son-1;
			ans.push_back(make_pair(u,t));
		}
		t++;
		//去递归子节点 
		dfs(v,u,t);
		//从子节点上来 
		ans.push_back(make_pair(u,t));
	}
	//当到达叶节点的时候,通过上面的进入ans
	//然后上面的for循环由于遇到 v==fa 且就执行一次
	//所以直接到下面,相当于叶节点回溯 
	//只有是叶节点 的时候 才会执行 
	
	//对于节点2来说
	//temp保存的是从父节点进入到的时间
	//此时的t是遍历完子节点上来的时间 
	if(u!=1&&t!=temp-1)
		ans.push_back(make_pair(u,temp-1));
}
int main()
{
	int n;
	scanf("%d",&n);
	for(int i=1; i<n; i++)
	{
		int u,v;
		scanf("%d%d",&u,&v);
		node[u].push_back(v);
		node[v].push_back(u);
	}
	for(int i=1; i<=n; i++)
		mmax=max(mmax,(int)node[i].size());
	dfs(1,-1,0);
	printf("%d
",ans.size());
	for(int i=0; i<ans.size(); i++)
		printf("%d %d
",ans[i].first,ans[i].second);
	return 0;
}
原文地址:https://www.cnblogs.com/QingyuYYYYY/p/12792440.html