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. 关于 java swing 使用按钮关闭窗口

    目的是给JButton添加点击操作,使指定JFrame窗口关闭. 网上不少说法是采用frame.dispose();的方法 但是采用frame.dispose();并没有使添加在frame上的wind ...

  2. Linux下文件以及文件名编码转换

    1.查看文件编码方式--file 文件名(但不是很准确) yang@mint-linux ~ $ file baidu.html baidu.html: HTML document, UTF-8 Un ...

  3. Example of how to implement a view-based source list (NSOutlineView) using Cocoa Bindings

    You tagged this with the cocoa-bindings tag, so I assume you mean "with bindings." I whipp ...

  4. python学习(day1)

    一.在这次实训之前,虽然听说过很多次python这种语言,但是从来没有真正去学习过,仅仅知道它是一种目前十分流行且功能非常强大的语言,可以方便快捷的实现很多功能.今天的课程带我了解了python,并且 ...

  5. CPP-基础:非静态成员函数后面加const,以及mutable修饰成员变量

    非静态成员函数后面加const(加到非成员函数或静态成员后面会产生编译错误),表示成员函数隐含传入的this指针为const指针,决定了在该成员函数中,任意修改它所在的类的成员的操作都是不允许的(因为 ...

  6. Bootstrap历练实例:表单帮助文件

    Bootstrap表单控件可以在输入框input上有一个块级帮助文本,为了添加一个占用整个宽度的内容块,请在input后添加help-block. 实例: <!DOCTYPE html>& ...

  7. shell脚本,如何监控mysql数据库。

    [root@localhost wyb]# cat jkmysql #!/bin/bash status=`/etc/init.d/mysqld status|grep running|wc -l` ...

  8. React初识整理(二)--生命周期的方法

    React生命周期主要有7中: 1. componentWillMount() :组件将要挂载时触发 ,只调用1次 2. componentDidMount() :组件挂载完成时触发,只调用1次 3. ...

  9. 有趣的this以及apply,call,bind方法

    看this指向谁,要看执行时而非定义时(箭头函数除外).函数没有绑定在对象上调用,非'strict'模式下,this指向window,否则为undefined 改变this指向的方法 1. apply ...

  10. HDU-2544-最短路(Bellman-Ford)

    Bellman-Ford算法是一个时间复杂度很高,但是它可以用来判断负环 负环就是上面的图,那个环的整体值小于零了,所以就是负环. 我们用Bellman-Ford算法进行更新,打一个表出来: k a ...