CF981C(菊花图)
题目描述
RAMESS知道很多关于树的问题(无循环的无向连通图)! 他创建了一个新的有用的树的划分,但他不知道如何构造它,所以他请求你的帮助! 划分是从树上的边中分裂出一些简单的路径,使得每个两条路径都具有至少一个公共顶点。树的每一个边都应该在一条路径上。 帮助RAMESs,找到这样的树的划分,或判断没有这样的划分。
题解
很明显只有菊花图才有这样的性质,所以只要判断这个图是不是菊花图就行,大体思路是找到度数大于2的点的个数加特判。
1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 #include<algorithm> 5 #include<cmath> 6 using namespace std; 7 const int N=100010; 8 int n,deg[N],ans,tmp; 9 int main(){ 10 scanf("%d",&n); 11 for(int i=1,u,v;i<=n-1;i++){ 12 scanf("%d%d",&u,&v); 13 deg[u]++; 14 deg[v]++; 15 if(deg[u]==3)ans++,tmp=u; 16 if(deg[v]==3)ans++,tmp=v; 17 } 18 if(ans==0){ 19 printf("Yes\n1\n"); 20 for(int i=1;i<=n;i++){ 21 if(deg[i]==1)printf("%d ",i); 22 } 23 return 0; 24 } 25 else if(ans==1){ 26 printf("Yes\n"); 27 for(int i=1;i<=n;i++){ 28 if(deg[i]==1)ans++; 29 } 30 printf("%d\n",ans-1); 31 for(int i=1;i<=n;i++){ 32 if(deg[i]==1)printf("%d %d\n",tmp,i); 33 } 34 return 0; 35 } 36 else { 37 printf("No\n"); 38 return 0; 39 } 40 return 0; 41 }