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