題目描述
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 }