【模擬】Codeforces - 1067B - Multihedgehog
阿新 • • 發佈:2018-12-25
題目連結<http://codeforces.com/contest/1067/problem/B>
題意:
定義一張棵樹k-multihedgehog:
1-multihedgehog是其中一個點度數大於等於3,其它點度數均為1.
k-multihedgehog是在k-1multihedgehog的基礎上,把所有度為1的點替換成一個1-multihedgehog並與原圖相連。
題解:
就按照題意反過來模擬一遍就好了,把最外層的度為1的點一層層的刪去。
我寫的這份程式碼比較醜,細節和特判的情況會比較麻煩。
#include<bits/stdc++.h> using namespace std; const int N=1e5+7; struct Edge{ int v,nxt; Edge(int v=0,int nxt=0):v(v),nxt(nxt){} }e[N*2]; int p[N],edn; void add(int u,int v){ e[++edn]=Edge(v,p[u]);p[u]=edn; e[++edn]=Edge(u,p[v]);p[v]=edn; } int d[N],vis[N]; int main(){ int n,k; scanf("%d%d",&n,&k); int u,v; memset(p,-1,sizeof(p));edn=-1; memset(vis,-1,sizeof(vis)); queue<int>q[2]; for(int i=1;i<n;i++){ scanf("%d%d",&u,&v); add(u,v); d[u]++,d[v]++; } if(k>=n){printf("No\n");return 0;} for(int i=1;i<=n;i++){ if(d[i]==1){ q[0].push(i); vis[i]=0; } } int ans=0; for(int t=0;;t^=1){ bool flag=true; while(!q[t].empty()){ int x=q[t].front();q[t].pop(); if(d[x]==0) continue; int u; for(int i=p[x];~i;i=e[i].nxt){ if(d[e[i].v]==0) continue; u=e[i].v;break; } if(vis[u]==t||d[u]<3){flag=false;break;} int cnt=0; for(int i=p[u];~i;i=e[i].nxt){ int v=e[i].v; if(d[v]==1&&vis[v]==t) d[v]--,d[u]--,cnt++; } if(cnt<3){flag=false;break;} q[t^1].push(u);vis[u]=t^1; } if(!flag){ans=-1;break;} if(q[t^1].empty()) break; ans++; } if(ans==k) printf("Yes\n"); else printf("No\n"); }