POJ 3099 Go Go Gorelians
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的更多相关文章
- POJ 3286 How many 0's?(几多0?)
POJ 3286 How many 0's?(几多0?) Time Limit: 1000MS Memory Limit: 65536K [Description] [题目描述] A Benedi ...
- POJ 3653 & ZOJ 2935 & HDU 2722 Here We Go(relians) Again(最短路dijstra)
题目链接: PKU:http://poj.org/problem? id=3653 ZJU:problemId=1934" target="_blank">http ...
- POJ 3370. Halloween treats 抽屉原理 / 鸽巢原理
Halloween treats Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 7644 Accepted: 2798 ...
- POJ 2356. Find a multiple 抽屉原理 / 鸽巢原理
Find a multiple Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 7192 Accepted: 3138 ...
- POJ 2965. The Pilots Brothers' refrigerator 枚举or爆搜or分治
The Pilots Brothers' refrigerator Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 22286 ...
- POJ 1753. Flip Game 枚举or爆搜+位压缩,或者高斯消元法
Flip Game Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 37427 Accepted: 16288 Descr ...
- POJ 3254. Corn Fields 状态压缩DP (入门级)
Corn Fields Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 9806 Accepted: 5185 Descr ...
- POJ 2739. Sum of Consecutive Prime Numbers
Sum of Consecutive Prime Numbers Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 20050 ...
- POJ 2255. Tree Recovery
Tree Recovery Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 11939 Accepted: 7493 De ...
随机推荐
- The Django Book 第三章 试图和URL配置
之前自学Django也有一段时间了,再过一个月就要入职新公司了(Python Django开发),即使现在还在入门级徘徊,再好好把Django基础过一遍吧. The Django Book 第三章 试 ...
- strong 、weak、copy 、assign 、retain 、unsafe_unretained 与autoreleasing区别和作用
strong关键字与retain关似,用了它,引用计数自动+1,用实例更能说明一切 @property (nonatomic, strong) NSString *stringA; @property ...
- CSS3制作的一款按钮特效
/*.btn { width:230px; height:70px; font-size:70px; font-weight:bold; overflow:hidden; font: "He ...
- Gym - 101291C (很有意思的最短路)
题意: 给出一张地图和机器人还有出口的位置,地图上面有障碍.然后给出UDLR上下左右四种指令,遇到障碍物或者越界的指令会忽略,剩下的继续执行. 只要到达出口就算找到出口,然后给你一串指令,让你修改指令 ...
- windows中安装模拟器后修改模拟器中的hosts方法
1.背景 有的时候我们测试安卓的app需要绑定hosts,这个时候我们如果只是修改PC机器上的hosts,然而在模拟器中并不生效.这个时候我们就需要修改模拟器中的hosts. 模拟器中的hosts为只 ...
- RestTemplate进行表单请求,注意要使用MultiValueMap
在对接API的时候,有时候文档中会说,表单提交,这时候就需要用到 MultiValueMap来操作,下面给大家展示一个简单的demo. MultiValueMap<Object, Object& ...
- (48)zabbix报警媒介:自定义脚本Custom alertscripts
自定义脚本媒介.zabbix会将信息传递给脚本,接下来你在脚本里面随意处理,一共会传递三个参数,按顺序接受也就是$1,$2,$3了,为了方便记忆,一般分别给他们赋值到To\Subject\body 配 ...
- (19)zabbix Applications使用介绍
介绍 Applications(我们翻译为应用程序)是item的一个组. 例如我们要监控MySQL,我们可以将所有和MySQL相关的item放到这个应用程序中. 例如MySQL的availabilit ...
- Linux基础学习-MariaDB数据库管理系统
数据库管理系统 数据库是指按照某些特定结构来存储数据资料的数据仓库,数据库管理系统是一种能够对数据库中存放的数据进行建立.修改.删除.查找.维护等操作的软件程序. 初始化MariaDB服务 [root ...
- SQLServer数据库查看死锁、堵塞情况
在压力测试过程中,不间断的按F5键执行上面的SQL语句,如果出现死锁或者堵塞现象,就会在执行结果中罗列出来.如果每次连续执行SQL,都有死锁或者堵塞出现,说明死锁或者堵塞的比较严重. --每秒死锁数量 ...