题目链接
用 dfs 来做的,三个样例全过,WA 了求助。
提交记录
代码:
#include <bits/stdc++.h>
using namespace std;
const int maxn=2e5+5;
int head[maxn<<1];
struct EDGE
{
int to,nxt;
}edge[maxn<<1];
int tot;
inline void add(int u,int to)
{
edge[++tot].to=to;
edge[tot].nxt=head[u];
head[u]=tot;
}
int n;
int rd[maxn];//存储入度
struct Val
{
int l,r;
}val[maxn];//存储每个点的取值范围
int dbg;
bool vis[maxn];
void dfs(int u,pair<int,int> num)
{
vis[u]=1;
// cout<<"u: "<<u<<endl;
if(rd[u]==1&&u!=1)
{//特判叶子节点不是1
//同时题目保证n>=2,
//所以一定不会出现只
//有一个节点的情况
val[u].l=num.first;
val[u].r=num.second;
return;
}
int l=num.first;
int r=num.second;
int sum=l-1;
for(int i=head[u];i;i=edge[i].nxt)
{
int to=edge[i].to;
// cout<<"pto: "<<to<<endl;
if(vis[to])continue;
// cout<<"to: "<<to<<endl;
if(rd[to]==1)
{//这个点是根节点
sum++;
dfs(to,{sum,sum});
}
if(rd[to]>1)
{
sum=max(sum,l);
dfs(to,{sum,r});
sum=max(sum,val[to].r);
}
}
r=sum;
val[u].l=l;
val[u].r=r;
}
int main()
{
scanf("%d",&n);
int ut,vt;
for(int i=1;i<n;i++)
{
scanf("%d%d",&ut,&vt);
add(ut,vt);
add(vt,ut);
rd[ut]++;
rd[vt]++;
}
dfs(1,{1,0x3f3f3f3f});
for(int i=1;i<=n;i++)
{
if(val[i].l==0x3f3f3f3f||val[i].r==0x3f3f3f3f)return -1;
printf("%d %d\n",val[i].l,val[i].r);
}
#ifndef ONLINE_JUDGE
system("pause");
#endif
return 0;
}