poj3107 树形dp
2015-12-30 14:36
281 查看
好久没更了。前段时间去ec-final,实力水一波,混了个铜,虽然很弱,但是可以算是对之前一段时间的回报吧。
现在每天忙着复习,逃课太多,啥都不会。。。不想挂科啊!!Orz...
题意(简化):警察想抓捕黑手党老大。现在警察们认为黑手党内部是树形结构,每个人看做节点。删除一个节点,这棵树就分为几个连同分量。现在对于每个节点,删去后得到的连同分量的最大值为t。t的值最小的是哪些人,都输出。
解法:对于节点,他的最大连同分量只可能来自2方面,他的孩子方向或者他的父亲方向。只要判断一下大小即可。
现在每天忙着复习,逃课太多,啥都不会。。。不想挂科啊!!Orz...
题意(简化):警察想抓捕黑手党老大。现在警察们认为黑手党内部是树形结构,每个人看做节点。删除一个节点,这棵树就分为几个连同分量。现在对于每个节点,删去后得到的连同分量的最大值为t。t的值最小的是哪些人,都输出。
解法:对于节点,他的最大连同分量只可能来自2方面,他的孩子方向或者他的父亲方向。只要判断一下大小即可。
#include<cstdio> #include<cstring> #include<vector> #include<iostream> using namespace std; const int MAXN = 50010; struct node{ int to; int next; }edge[MAXN*3]; int index,vis[MAXN],pre[MAXN],n; int num[MAXN],dp[MAXN],way[MAXN],ans[MAXN]; void add(int x,int y) { edge[index].to = y; edge[index].next = pre[x]; pre[x] = index++; } void dfs1(int rt) { vis[rt] = 1; int i; for(i=pre[rt]; i!=-1; i=edge[i].next){ int v = edge[i].to; if(!vis[v]){ dfs1(v); if(dp[rt] < num[v]){ dp[rt] = num[v]; way[rt] = v; } num[rt] += num[v]; } } num[rt] += 1; } void dfs2(int rt,int pa) { vis[rt] = 1; int i; if(pa == -1){ for(i=pre[rt]; i!=-1; i=edge[i].next){ int v = edge[i].to; if(!vis[v]){ ans[rt] =max(ans[rt], num[v]); dfs2(v,rt); } } } else { ans[rt] = n - num[rt]; for(i=pre[rt]; i!=-1; i=edge[i].next){ int v = edge[i].to; if(!vis[v]){ ans[rt] = max(ans[rt], dp[rt]); dfs2(v,rt); } } } } int main() { int i,j; while(~scanf("%d",&n)) { index = 1; memset(pre,-1,sizeof(pre)); for(i=1; i<n; i++){ int x,y; scanf("%d%d",&x,&y); add(x,y); add(y,x); } memset(dp,0,sizeof(dp)); memset(way,0,sizeof(way)); memset(num,0,sizeof(num)); memset(ans,0,sizeof(ans)); memset(vis,0,sizeof(vis)); dfs1(1); memset(vis,0,sizeof(vis)); dfs2(1,-1); int v = 9999999999; for(i=1; i<=n; i++){ if(ans[i] != 0) v = min(v,ans[i]); } int flag = 0; for(i=1; i<=n; i++){ if(v == ans[i]) { if(!flag){ printf("%d",i); flag = 1; } else printf(" %d",i); } } cout<<endl; } }
相关文章推荐
- only position independent executables (PIE) are supported的解决问题
- oracle11g复合分区创建方法(Interval版)
- 《swift2.0 官方教程中文版》 第2章-19类型转换
- android学习(1) - Button单击事件的响应
- 晴天
- Android 开源框架ActionBarSherlock 和 ViewPager 仿网易新闻客户端
- 安装KB3132372补丁后,WIN10中IE内核加载flash崩溃
- 线程的互斥与同步通信 - 例子:子主线程打印,子主线程互补干扰问题
- git fork
- 最近做个东西 写了一个HTML解析程序
- 如何部署tomcat项目到远程服务器上
- 模二加计算
- Android实现圆角Button按钮
- 世界是数字的(三)
- iOS Crash文件的解析(一)
- CentOS系统启动流程
- Java与C/C++有什么区别
- Linux(CentOS)常用命令
- github学习
- 在Laravel中一步一步创建Packages