BZOJ 1086 王室联邦
2016-06-14 09:06
232 查看
http://www.lydsy.com/JudgeOnline/problem.php?id=1086
思路:贪心,每次当储存的儿子大于等于B时,分出一个块,这样每次每个块至多为2B,这样剩下的没有被分的块小于B,可以加入任意一个块,都是合法的。
思路:贪心,每次当储存的儿子大于等于B时,分出一个块,这样每次每个块至多为2B,这样剩下的没有被分的块小于B,可以加入任意一个块,都是合法的。
#include<algorithm> #include<cstdio> #include<cmath> #include<cstring> #include<iostream> int tot,go[200005],first[200005],next[200005],n,m; int top,c[200005],pd,size[200005],cap[200005],belong[200005],sz; int read(){ char ch=getchar();int t=0,f=1; while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();} while ('0'<=ch&&ch<='9'){t=t*10+ch-'0';ch=getchar();} return t*f; } void insert(int x,int y){ tot++; go[tot]=y; next[tot]=first[x]; first[x]=tot; } void add(int x,int y){ insert(x,y);insert(y,x); } void dfs(int x,int fa){ c[++top]=x; for (int i=first[x];i;i=next[i]){ int pur=go[i]; if (pur==fa) continue; dfs(pur,x); if (size[x]+size[pur]>=m){ cap[++sz]=x;size[x]=0; while (c[top]!=x) belong[c[top--]]=sz; }else size[x]+=size[pur]; } size[x]++; } void find(int x,int fa){ if (belong[x]) { pd=belong[x]; return; } for (int i=first[x];i;i=next[i]){ int pur=go[i]; if (pur==fa) continue; if (!pd) find(pur,x); } } int main(){ n=read();m=read(); if (n<m){ printf("0\n"); return 0; } if (m==1){ printf("%d\n",n); for (int i=1;i<=n;i++) printf("%d ",i); printf("\n"); for (int i=1;i<=n;i++) printf("%d ",i); printf("\n"); return 0; } for (int i=1;i<n;i++){ int x=read(),y=read(); add(x,y); } dfs(1,0); pd=0; int cnt=0,th; for (int i=1;i<=n;i++) if (!belong[i]) cnt++,th=1; if (cnt>=m){ sz++; cap[sz]=th; for (int i=1;i<=n;i++) if (!belong[i]) belong[i]=sz; } for (int i=1;i<=n;i++) if (!belong[i]){ if (!pd) find(i,0); if (pd) belong[i]=pd; } printf("%d\n",sz); for (int i=1;i<=n;i++) printf("%d ",belong[i]); printf("\n"); for (int i=1;i<=sz;i++) printf("%d ",cap[i]); printf("\n"); }
相关文章推荐
- c#之双色球
- 分数类的运算符重载
- window7 已经分好区的硬盘如何再次分区?
- SVN版本管理工具介绍
- ModernUI + MVVM 导航
- Time类的运算符重载
- HBuild Hybrid App开发(六)事件绑定
- sql基本语法
- cordova的camera插件,IOS下图片旋转问题
- NPOI 将DataGridView导出到Excel
- git基本操作命令
- BeanUtil里利用反射来写增、删、改、查
- 日志消息输出到控制台上
- MySql基础操作
- oracle导入dmp备份文件
- CSDN的博客积分计算规则及博客排名规则
- linux下定时器struct itimerval的使用
- sql优化
- 游戏中存在一种魔法——《游戏设计梦工厂》
- Unity3D游戏开发之“unity3D命令行参数”