Codeforces Round #518 (Div. 2): E. Multihedgehog(模擬)
阿新 • • 發佈:2018-12-17
題意:
1-刺蝟圖滿足:
- 是一棵樹
- 存在一箇中心節點u與其它所有點相連
- 包括中心節點在內,至少4個節點
2-刺蝟圖滿足:
- 是一棵樹
- 存在一箇中心節點u與其它所有1-刺蝟圖的中心節點相連
- 這個中心節點至少連線3個以上的1-刺蝟圖
k-刺蝟圖依次類推,給你一棵樹,問你它是不是k-刺蝟圖
思路:
按題意模擬即可,注意細節
- k這麼大肯定毫無意義,當k超過15時就一定是no了,因為沒有那麼多節點(大概節點個數要是3的k次方倍)
- 直接遞迴不容易出錯,也就是每次將葉子節點刪掉即可
#include<stdio.h> #include<string.h> #include<algorithm> #include<map> #include<string> #include<math.h> #include<queue> #include<stack> #include<iostream> using namespace std; #define LL long long #define mod 1000000007 vector<int> G[100005]; int in[100005][16], flag[100005]; int main(void) { int n, k, x, y, i, j, p, v, sum; scanf("%d%d", &n, &k); for(i=1;i<=n-1;i++) { scanf("%d%d", &x, &y); G[x].push_back(y); G[y].push_back(x); in[x][0]++, in[y][0]++; } if(k>=15 || n<=3) printf("No\n"); else { sum = n; for(p=1;p<=k;p++) { for(i=1;i<=n;i++) { if(in[i][p-1]==1) { for(j=0;j<G[i].size();j++) { v = G[i][j]; if(flag[v]) continue; if(flag[v]==0 && in[v][p-1]==1) { printf("No\n"); return 0; } in[v][p]++; } flag[i] = 1, sum--; } } for(i=1;i<=n;i++) { if(in[i][p]==0 || flag[i]) continue; if(in[i][p]<=2) { printf("No\n"); return 0; } in[i][p] = 1; } if(sum==1) { if(p==k) printf("Yes\n"); else printf("No\n"); return 0; } } printf("No\n"); return 0; } }