http://poj.org/problem?id=3099

树的重心:找到一个点,其所有的子树中最大的子树节点数最少,那么这个点就是这棵树的重心

求树的重心

如何在点中构造符合条件的树

得到树后 从任意一个点出发 dfs一次找到离这个点最远的点作为root1

在以root1出发 同样的方式求得root2

root1-root2就是这个树的直径 那么中心必然在这个直径上, 如果直径上点的个数是奇数的话那么 这个点就是重心 否则有两个重心 分别输出

 #include <iostream>
#include <string.h>
#include <stdio.h>
#include <vector>
#include <math.h>
#define MAXN 1007 using namespace std; int dp[MAXN];
int id[MAXN];
int pre[MAXN];
double dist[MAXN][MAXN];
double x[MAXN], y[MAXN], z[MAXN];
int path[MAXN];
int n;
vector<int> G[MAXN]; double getdis(int i, int j)
{
double dx = x[i] - x[j];
double dy = y[i] - y[j];
double dz = z[i] - z[j];
return sqrt(dx*dx+dy*dy+dz*dz);
} void build()
{
for(int i = ; i < n; i++)
{
double dis = 0x3fffffff;
int obj = -;
for (int j = ; j < i; j++)
{
if (dist[id[i]][id[j]] < dis)
{
dis = dist[id[i]][id[j]];
obj = j;
}
}
if (obj == -) continue;
int u = id[i], v = id[obj];
G[u].push_back(v);
G[v].push_back(u);
}
}
void dfs(int x, int par, int len)
{
dp[x] = len;
for (int i = ; i < G[x].size(); i++)
{
if (G[x][i] != par)
dfs(G[x][i], x, len+);
} } void dfs1(int x, int par, int len)
{
dp[x] = len;
pre[x] = par;
for (int i = ; i < G[x].size(); i++)
{
if(G[x][i] != par)
dfs1(G[x][i], x, len+);
}
}
int main()
{
while (~scanf("%d", &n))
{
if (n == ) break;
memset(dp, , sizeof(dp));
memset(path, , sizeof(path));
memset(dist, , sizeof(dist));
memset(pre, , sizeof(pre));
for (int i = ; i < MAXN; i++)
G[i].clear();
for (int i = ; i < n; i++)
{
scanf("%d%lf%lf%lf", &id[i], &x[i], &y[i], &z[i]);
}
for (int i = ; i < n; i++)
for (int j = ; j < n; j++)
dist[id[i]][id[j]] = getdis(i, j);
build();
dfs(id[], -, );//权值都为1
int tmp = ;
//找到离节点最远的节点 得到root1
int root1, root2;
for (int i = ; i < n; i++)
{
if ( dp[id[i]] > tmp)
{
tmp = dp[id[i]];
root1 = id[i];
}
}
memset(dp, , sizeof(dp));
dfs1(root1, -, );
tmp = ;
for (int i = ; i < n; i++)
{
if (dp[id[i]] > tmp)
{
tmp = dp[id[i]];
root2 = id[i];
}
}//找到root2;
int s = ;
for(int i = root2; i != -; i = pre[i])
{
path[++s] = i;
}
int mid = (s+)/;
if (s % == )
{
printf("%d\n", path[mid]);
}
else
{
int a = path[mid], b = path[mid+];
printf("%d %d\n", min(a, b), max(a, b));
} } return ;
}

关于树的重心更多的内容

转载 :http://www.cnblogs.com/patrickzhou/p/5867208.html

POJ 3099 Go Go Gorelians的更多相关文章

  1. POJ 3286 How many 0's?(几多0?)

    POJ 3286 How many 0's?(几多0?) Time Limit: 1000MS   Memory Limit: 65536K [Description] [题目描述] A Benedi ...

  2. POJ 3653 &amp; ZOJ 2935 &amp; HDU 2722 Here We Go(relians) Again(最短路dijstra)

    题目链接: PKU:http://poj.org/problem? id=3653 ZJU:problemId=1934" target="_blank">http ...

  3. POJ 3370. Halloween treats 抽屉原理 / 鸽巢原理

    Halloween treats Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 7644   Accepted: 2798 ...

  4. POJ 2356. Find a multiple 抽屉原理 / 鸽巢原理

    Find a multiple Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7192   Accepted: 3138   ...

  5. POJ 2965. The Pilots Brothers' refrigerator 枚举or爆搜or分治

    The Pilots Brothers' refrigerator Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 22286 ...

  6. POJ 1753. Flip Game 枚举or爆搜+位压缩,或者高斯消元法

    Flip Game Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 37427   Accepted: 16288 Descr ...

  7. POJ 3254. Corn Fields 状态压缩DP (入门级)

    Corn Fields Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 9806   Accepted: 5185 Descr ...

  8. POJ 2739. Sum of Consecutive Prime Numbers

    Sum of Consecutive Prime Numbers Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 20050 ...

  9. POJ 2255. Tree Recovery

    Tree Recovery Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 11939   Accepted: 7493 De ...

随机推荐

  1. Linux OpenGL 实践篇-13-geometryshader

    几何着色器 几何着色器是位于图元装配和片元着色器之前的一个着色器阶段,是一个可选阶段.它的输入是一个图元的完整的顶点信息,通常来自于顶点着色器,但如果细分计算着色器启用的话,那输入则是细分计算着色器的 ...

  2. 解决Genymotion Error: “Unable to load VirtualBox Engine” on Yosemite. VirtualBox installed

    Mac 环境,输入命令 sudo ln -s /usr/local/bin/VBoxManage /usr/bin/VBoxManage

  3. kvc to nsdata

        [NSKeyedArchiver archivedDataWithRootObject:arr];    [NSKeyedUnarchiver unarchiveObjectWithData: ...

  4. JAVA初级必须要搞懂的事项(希望对新手有所帮助)

    1        安装JDK=> (1,下载JDK,安装,一般目录为C:\Program Files\Java中:2,通过Dos命令测试JDK是否安装=>java –version命令查看 ...

  5. Robot Framework(十) 执行测试用例——测试执行

    3.2测试执行 本节描述如何执行从解析的测试数据创建的测试套件结构,如何在失败后继续执行测试用例,以及如何正常停止整个测试执行. 3.2.1执行流程 执行套房和测试 设置和拆卸 执行顺序 3.2.2继 ...

  6. caffe实现多label输入(修改源码版)

    http://blog.csdn.net/u013010889/article/details/54614067 这个人的博客本身也相当好

  7. CPP-基础:函数指针,指针函数,指针数组

    函数指针 函数指针是指向函数的指针变量. 因而“函数指针”本身首先应是指针变量,只不过该指针变量指向函数.这正如用指针变量可指向整型变量.字符型.数组一样,这里是指向函数.如前所述,C在编译时,每一个 ...

  8. CS193p Lecture 4 - Foundation, Attributed Strings

    消息机制 调用一个实例(instance)的方法(method),就是向该实例的指针发送消息(message),实例收到消息后,从自身的实现(implementation)中寻找响应这条消息的方法. ...

  9. 科普NDIS封包过滤

    闲言:    这个月一直在学习NDIS驱动编程,杂七杂八的资料都看个遍了,做了点笔记,捋捋思路,发上来备忘.    Ps:只是小菜的一点学习笔记,没什么技术含量,不过版主如果觉得对大家稍微有点帮助的话 ...

  10. 简单css动画 fadeIn fadeOut flash

    考虑兼容性采用 -webkit- -o- -mos- -ms- @keyframes fadeIn{ 0%{ opacity: 0; display: block; } 100%{ opacity: ...