Avito Code Challenge 2018 C

本文介绍了一种将树形结构拆分为若干路径的方法,确保任意两条路径至少有一个交点。文章详细阐述了算法思路,包括特殊情况处理及实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

传送
题意:给定一棵树,将树拆分成一些没有重叠的路径,要求任何两条路径之间必须要有一个交点。
题解:稍微分析,除了只有一条路径的情况,有多条路径时,要满足两两香叫,必然所有的路径相加与一点,否则会成环,那就不是树了,排除这两种情况后就是没法划分的树了。要找出这样的路径:端点度数为1,或者度数等于度数为1的顶点个数。

#include<bits/stdc++.h>
using namespace std;
int in[100005];
int main()
{
    int n;
    int a,b;
    cin>>n;
    int ans[100005];
    int cnt=0;
    memset(in,0,sizeof in);
    for(int i=0;i<n-1;i++)
    {
        cin>>a>>b;
        in[a]++;
        in[b]++;
    }
    int f=0,e=0,c=0;
    for(int i=1;i<=n;i++)
    {
        if(in[i]>2)f=1,e=i,c=in[i];
        if(in[i]==1)ans[cnt++]=i;
    }
    if(f==0)
    {
        cout<<"Yes"<<endl;
        cout<<1<<endl;
        cout<<ans[0]<<' '<<ans[1]<<endl;
    }
    else if(c==cnt)
    {
        cout<<"Yes"<<endl;
        cout<<cnt<<endl;
        for(int i=0;i<cnt;i++)
        {
            cout<<e<<' '<<ans[i]<<endl;
        }
    }
    else cout<<"No"<<endl;
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值