Avito Code Challenge 2018 C

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

猜你喜欢

转载自blog.csdn.net/qq_35160381/article/details/80482801