Atcoder240 E题求助
  • 板块学术版
  • 楼主__vector__
  • 当前回复6
  • 已保存回复6
  • 发布时间2022/2/25 22:46
  • 上次更新2023/10/28 07:45:10
查看原帖
Atcoder240 E题求助
507348
__vector__楼主2022/2/25 22:46

题目链接 用 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;
}
2022/2/25 22:46
加载中...