P2325 [SCOI2005]王室联邦
SPJ
构造一下,用栈记录即可
#include<bits/stdc++.h> using namespace std; int sth,head[10000],n,a,b,c,m,ne,sta[10000],cnt,ct[10000],tag[10000]; struct node{int nxt,to;}eg[10000]; void adde(int u,int v) { eg[++ne].nxt=head[u]; eg[ne].to=v; head[u]=ne; } void dfs(int u,int fa) { int now=sth; for(int i=head[u];i;i=eg[i].nxt) if(eg[i].to!=fa) { dfs(eg[i].to,u); if(sth-now>=m) { ct[++cnt]=u; while(sth>now) tag[sta[sth--]]=cnt; } } sta[++sth]=u; } int main() { cin>>n>>m; for(int i=1;i<n;i++) {cin>>a>>b;adde(a,b);adde(b,a);} dfs(1,0); if(!cnt)ct[++cnt]=1; while(sth) tag[sta[sth--]]=cnt; cout<<cnt<<endl; for(int i=1;i<=n;i++)cout<<tag[i]<<" ";cout<<endl; for(int i=1;i<=cnt;i++)cout<<ct[i]<<" "; }