本题与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相关推荐

  1. POJ 3107 Godfather (树的重心)

    题目地址:POJ 3107 还是裸的树的重心,只不过这个要求将所有的重心都输出.很简单. 代码如下: #include <iostream> #include <string.h&g ...

  2. POJ 3107 Godfather(树形DP(找重心))

    任重而道远 Description Last years Chicago was full of gangster fights and strange murders. The chief of t ...

  3. POJ 3107 Godfather 笔记

    公司的从属关系呈树状,n 对从属关系,每对从属关系不能确定谁的官职大.老板在公司中职务最大且只有一个,已知删除老板后的最大连通组件的大小最小.列举可能的老板.

  4. 【POJ 3107】 Godfather

    [题目链接] 点击打开链接 [算法] 这题描述有些繁琐,先简化一下题意 : 对于一棵无根树,删除一个节点,使得其余的联通块中,最大的联通块最小 那么,这题就很好做了 对这棵树进行一遍DFS,求出每个节 ...

  5. Godfather POJ - 3107 (求树的重心)

    题目链接 题意:给定一棵树,要求按编号从小到大输出重心. 树的重心: 定义:找到一个点满足其所有的子树中最大的子树节点数最少,那么这个点就算是树的重心. 性质: 1.删除重心后所得的所有子树,节点数不 ...

  6. 树形dp树的重心(D - Godfather POJ - 3107)

    题目链接:https://cn.vjudge.net/contest/277955#problem/D 题目大意:求树的重心(树的重心指的是树上的某一个点,删掉之后形成的多棵树中节点数最大值最小). ...

  7. Godfather POJ - 3107 树的重心

    题目要求输出给出树的所有重心. 有个结论:一棵有根树至多有两个重心. #include<iostream> #include<cstring> using namespace ...

  8. 【树形DP】树的重心详解+多组例题详解

    目录 定义: 性质: 算法分析: POJ 1655 Balancing Act(求重心) POJ 3107 Godfather P1364 医院设置(树形DP) 定义: 树的重心也叫树的质心.对于一棵 ...

  9. DP Intro - Tree DP Examples

    因为上次比赛sb地把一道树形dp当费用流做了,受了点刺激,用一天时间稍微搞一下树形DP,今后再好好搞一下) 基于背包原理的树形DP poj 1947 Rebuilding Roads 题意:给你一棵树 ...

最新文章

  1. react: nextJs koa project basic structure
  2. 算法62---最长回文子序列长度(子串)、回文子序列总共个数(子串)【动态规划】...
  3. python中的面向对象编程讲解_Python中的面向对象编程详解(上)
  4. 吐血总结:AQS到底是什么?
  5. boost::fibers模块实现single stream的测试程序
  6. iOS之深入解析dyld与ObjC关联的底层原理
  7. postgresql 分词_使用PostgreSQL进行中文全文检索
  8. bzoj 2908. 又是nand(树链剖分+区间NAND+单点修改)
  9. det曲线_平面曲线的曲率的复数表示
  10. linux Packet socket (1)简单介绍
  11. 理想汽车CEO李想晒11月理想ONE成绩
  12. 【SpringBoot与SpringCloud的一些根本】
  13. OpenShift 4 之通过Dockerfile部署容器应用
  14. 小鹏汽车CEO疑似隔空回应偷窃技术传闻;​苹果明年新款iPhone将使用增强版5nm芯片;Windows诞生35周年|极客头条...
  15. javaweb 初学建议
  16. VMworld 2016 US带来了哪些惊喜?
  17. 【SENCHA TOUCH】页面动画跳转切换
  18. 网易公开课斯坦福大学-机器学习
  19. 百度竞价需抓住消费者心理
  20. 美国合同法笔记-合同定义

热门文章

  1. 订阅发布系统得解耦与冗余
  2. 如何使用dtls协议抵御重放攻击
  3. jconsole是否可以在生产环境使用_jconsole使用
  4. idea无法创建class
  5. hsv分别代表什么_猫语大解密!你们知道不同的喵叫声,分别代表什么吗?
  6. 1.1.0-简介-P12-分布式锁的解决方案(二)
  7. 20-10-010-安装-kafka_2.11-1.1.0-单节点测试
  8. 【Kafka】Kafka Leader:none ISR 为空 消费超时
  9. Orcale的存储过程
  10. iview使用原生html,iview在vue-cli3如何按需加载的方法