POJ 3107 - Godfather
本题与POJ 1655的区别是要把所有重心的点按顺序输出出来。
// poj3107 Godfather #include <cstdio> #include <cstring> #define NDEBUG#define MAXN 50005using namespace std;int N; int edgefw[MAXN*2], edge[MAXN*2], head[MAXN], eptr;#define EI(j, k) ({ \edge[eptr] = k, edgefw[eptr] = head[j]; \head[j] = eptr++; \ })int dp[MAXN], dp2[MAXN]; char vis[MAXN];void dfs(int i) {vis[i] = 1;int p, maxk = 0, sumn = 1;for(p = head[i]; p>=0; p = edgefw[p]) {int t = edge[p];if (!vis[t]) {if (!dp2[t]) dfs(t);sumn += dp2[t];if (maxk < dp2[t])maxk = dp2[t];}}if (sumn != N && N - sumn > maxk) maxk = N - sumn;dp[i] = maxk, dp2[i] = sumn; }int main(void) {#ifndef NDEBUGfreopen("poj3107.in", "r", stdin);#endif // NDEBUGscanf("%d", &N);memset(head, -1, sizeof(int) * N), eptr = 0;int i, j, root;root = 0;for(i=1; i<N; ++i) {int k;scanf("%d%d", &j, &k);--j,--k; EI(j, k), EI(k, j);if (root == k) root = j;}dfs(root);j = 0;for(i = 1; i < N; ++i)if (dp[i] < dp[j])j = i;root = 0;for(i = 0; i < N; ++i)if (dp[i] == dp[j]) {printf("%d", ++i);break;}for(; i<N; ++i)if (dp[i] == dp[j])printf(" %d", i+1);putchar('\n');return 0; }
3107 | Accepted | 4104K | 532MS | G++ | 1249B | 2014-05-01 01:22:57 |
5/3更新 求树的重心模板:
1 #include <cstdio> 2 #include <cstring> 3 using namespace std; 4 5 6 #define FOR(p,i,s,t) for(__typeof(p) i=s; i<t; ++i) 7 #define REP(t,i,n) FOR(t,i,0,n) 8 9 #define ECH(it, A) for (__typeof(A.begin()) it=A.begin(); it != A.end(); ++it) 10 #define RST(x,y) memset(x, y, sizeof(x)) 11 #define RST0(x) RST(x,0) 12 13 typedef int Vt, Lt; 14 const __typeof(Vt) MAXV = 50005; 15 16 #define MAXE ((MAXV<<1) - 2) 17 18 Vt Vefw[MAXE], Veh[MAXV], eptr = 0; 19 struct Vedge { 20 Vt t; 21 Lt l; 22 Vedge() {} 23 Vedge(Vt _t): t(_t), l(1) {} 24 Vedge(Vt _t, Lt _l): t(_t), l(_l) {} 25 void attach(Vt s) { 26 extern Vedge Vs[]; 27 memcpy(Vs + eptr, this, sizeof(Vedge)); 28 Vefw[eptr] = Veh[s]; Veh[s] = ++eptr; 29 } 30 }; 31 #define addedge(s,t,l) ({Vedge e(t,l); e.attach(s);}) 32 Vedge Vs[MAXE]; 33 Vt gcoref_tot; 34 char gc_8[MAXV]; 35 Vt gc_maxk[MAXV], gc_sumn[MAXV]; 36 37 int gc_root; 38 39 void gcoref(Vt i) 40 { 41 char _gc8; 42 if (!(_gc8 = gc_8[i])) gc_8[i] = -1; // 遍历去环 43 Vt sumn = 1, maxk = 0; 44 for(Vt e = Veh[i]; e; e = Vefw[e]) { 45 Vt t = Vs[--e].t; 46 if (!gc_8[t]) { 47 gcoref(t); 48 sumn += gc_sumn[t]; 49 if (maxk < gc_sumn[t]) 50 maxk = gc_sumn[t]; 51 } 52 } 53 gc_8[i] = _gc8; // gc_8还有其他用途 54 if (gcoref_tot - sumn > maxk) maxk = gcoref_tot - sumn; 55 gc_sumn[i] = sumn, gc_maxk[i] = maxk; 56 if (gc_maxk[gc_root] > maxk) gc_root = i; 57 } 58 59 inline Vt gcore(Vt root) 60 { 61 gc_maxk[gc_root = root] = gcoref_tot; 62 gcoref(root); 63 return gc_root; 64 } 65 66 int N; 67 68 // 本模板使用方式: gcoref_tot = 实际节点数 69 // gc_8 != 0, 该节点被剪掉(忽略),可以用来存储其他信息 70 // addedge加边(注意针对 无根树 要加双向),gcore返回重心节点 71 // gc_maxk里面存储所有节点的最大真子树的节点数. 72 73 int main(void) 74 { 75 // freopen("poj3107.txt", "r", stdin); 76 scanf("%d", &N); 77 Vt root = 0; 78 REP(int, i, N-1) { 79 Lt l; 80 Vt s,t; 81 scanf("%d%d", &s, &t); --s, --t; 82 addedge(s,t,1), addedge(t,s,1); 83 if (root == t) root = s; 84 } 85 gcoref_tot = N; 86 root = gcore(root); 87 Vt i; 88 for(i = 0; i < N; ++i) 89 if (gc_maxk[i] == gc_maxk[root]) { 90 printf("%d", ++i); 91 break; 92 } 93 for(; i<N; ++i) 94 if (gc_maxk[i] == gc_maxk[root]) 95 printf(" %d", i+1); 96 putchar('\n'); 97 return 0; 98 }
转载于:https://www.cnblogs.com/e0e1e/p/poj_3107.html
POJ 3107 - Godfather相关推荐
- POJ 3107 Godfather (树的重心)
题目地址:POJ 3107 还是裸的树的重心,只不过这个要求将所有的重心都输出.很简单. 代码如下: #include <iostream> #include <string.h&g ...
- POJ 3107 Godfather(树形DP(找重心))
任重而道远 Description Last years Chicago was full of gangster fights and strange murders. The chief of t ...
- POJ 3107 Godfather 笔记
公司的从属关系呈树状,n 对从属关系,每对从属关系不能确定谁的官职大.老板在公司中职务最大且只有一个,已知删除老板后的最大连通组件的大小最小.列举可能的老板.
- 【POJ 3107】 Godfather
[题目链接] 点击打开链接 [算法] 这题描述有些繁琐,先简化一下题意 : 对于一棵无根树,删除一个节点,使得其余的联通块中,最大的联通块最小 那么,这题就很好做了 对这棵树进行一遍DFS,求出每个节 ...
- Godfather POJ - 3107 (求树的重心)
题目链接 题意:给定一棵树,要求按编号从小到大输出重心. 树的重心: 定义:找到一个点满足其所有的子树中最大的子树节点数最少,那么这个点就算是树的重心. 性质: 1.删除重心后所得的所有子树,节点数不 ...
- 树形dp树的重心(D - Godfather POJ - 3107)
题目链接:https://cn.vjudge.net/contest/277955#problem/D 题目大意:求树的重心(树的重心指的是树上的某一个点,删掉之后形成的多棵树中节点数最大值最小). ...
- Godfather POJ - 3107 树的重心
题目要求输出给出树的所有重心. 有个结论:一棵有根树至多有两个重心. #include<iostream> #include<cstring> using namespace ...
- 【树形DP】树的重心详解+多组例题详解
目录 定义: 性质: 算法分析: POJ 1655 Balancing Act(求重心) POJ 3107 Godfather P1364 医院设置(树形DP) 定义: 树的重心也叫树的质心.对于一棵 ...
- DP Intro - Tree DP Examples
因为上次比赛sb地把一道树形dp当费用流做了,受了点刺激,用一天时间稍微搞一下树形DP,今后再好好搞一下) 基于背包原理的树形DP poj 1947 Rebuilding Roads 题意:给你一棵树 ...
最新文章
- react: nextJs koa project basic structure
- 算法62---最长回文子序列长度(子串)、回文子序列总共个数(子串)【动态规划】...
- python中的面向对象编程讲解_Python中的面向对象编程详解(上)
- 吐血总结:AQS到底是什么?
- boost::fibers模块实现single stream的测试程序
- iOS之深入解析dyld与ObjC关联的底层原理
- postgresql 分词_使用PostgreSQL进行中文全文检索
- bzoj 2908. 又是nand(树链剖分+区间NAND+单点修改)
- det曲线_平面曲线的曲率的复数表示
- linux Packet socket (1)简单介绍
- 理想汽车CEO李想晒11月理想ONE成绩
- 【SpringBoot与SpringCloud的一些根本】
- OpenShift 4 之通过Dockerfile部署容器应用
- 小鹏汽车CEO疑似隔空回应偷窃技术传闻;​苹果明年新款iPhone将使用增强版5nm芯片;Windows诞生35周年|极客头条...
- javaweb 初学建议
- VMworld 2016 US带来了哪些惊喜?
- 【SENCHA TOUCH】页面动画跳转切换
- 网易公开课斯坦福大学-机器学习
- 百度竞价需抓住消费者心理
- 美国合同法笔记-合同定义
热门文章
- 订阅发布系统得解耦与冗余
- 如何使用dtls协议抵御重放攻击
- jconsole是否可以在生产环境使用_jconsole使用
- idea无法创建class
- hsv分别代表什么_猫语大解密!你们知道不同的喵叫声,分别代表什么吗?
- 1.1.0-简介-P12-分布式锁的解决方案(二)
- 20-10-010-安装-kafka_2.11-1.1.0-单节点测试
- 【Kafka】Kafka Leader:none ISR 为空 消费超时
- Orcale的存储过程
- iview使用原生html,iview在vue-cli3如何按需加载的方法