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 } 
View Code

 

posted @ 2018-07-28 09:18  Xu-daxia  阅读(1738)  评论(0编辑  收藏  举报