1056. Computer Net

Time limit: 2.0 second
Memory limit: 64 MB

Background

Computer net is created by consecutive computer plug-up to one that has already been connected to the net. Each new computer gets an ordinal number, but the protocol contains the number of its parent computer in the net. Thus, protocol consists of several numbers; the first of them is always 1, because the second computer can only be connected to the first one, the second number is 1 or 2 and so forth. The total quantity of numbers in the protocol is 
N − 1 (
N is a total number of computers). For instance, protocol 1, 1, 2, 2 corresponds to the following net:

1 - 2 - 5
| |
3 4
The distance between the computers is the quantity of mutual connections (between each other) in chain. Thus, in example mentioned above the distance between computers #4 and #5 is 2, and between #3 and #5 is 3.
Definition. Let the center of the net be the computer which has a minimal distance to the most remote computer. In the shown example computers #1 and #2 are the centers of the net.

Problem

Your task is to find all the centers using the set protocol.

Input

The first line of input contains an integer  N, the quantity of computers (2 ≤  N ≤ 10000). Successive  N − 1 lines contain protocol.

Output

Output should contain ordinal numbers of the determined net centers in ascending order.

Sample

input output
5
1
1
2
2
1 2

题意:1号电脑为根节点,给出2~n号电脑的父节点,求出用那些电脑当中心,到其余电脑的最大距离最小。
思路:一点到所有子节点的最大距离很好求,但是我们还要知道通过父节点所能到达的最大距离,所以先处理一下,求出所有点到其子节点的最大距离边和次大距离边,然后再分析每个节点是否在其父节点的最大距离边上,如果在的话,就用父节点的次大距离来更新该节点,否则用父节点的最大距离来更新。



#include<stdio.h>
#include<string.h>
const int N=10001;
int dp[N][2],vis[N],head[N],num,ans;
struct edge
{
int st,ed,next;
}e[N*4];
void addedge(int x,int y)
{
e[num].st=x;e[num].ed=y;e[num].next=head[x];head[x]=num++;
e[num].st=y;e[num].ed=x;e[num].next=head[y];head[y]=num++;
}
void dfs1(int u)
{
vis[u]=1;
int i,v;
for(i=head[u];i!=-1;i=e[i].next)
{
v=e[i].ed;
if(vis[v]==1)continue;
dfs1(v);
if(dp[v][1]+1>dp[u][1])
{
dp[u][0]=dp[u][1];
dp[u][1]=dp[v][1]+1;
}
else if(dp[v][1]+1>dp[u][0])
dp[u][0]=dp[v][1]+1;
}
}
void dfs2(int u)
{
vis[u]=1;
int i,v,temp;
for(i=head[u];i!=-1;i=e[i].next)
{
v=e[i].ed;
if(vis[v]==1)continue;
if(dp[u][1]==dp[v][1]+1)//在父节点的最大距离边上
temp=dp[u][0]+1;
else temp=dp[u][1]+1;
if(temp>dp[v][1]) //更新v节点的最大,次大边
{
dp[v][0]=dp[v][1];
dp[v][1]=temp;
}
else if(temp>dp[v][0])
{
dp[v][0]=temp;
}
if(ans>dp[v][1])
ans=dp[v][1];
dfs2(v);
}
}
int main()
{
int n,i,x;
while(scanf("%d",&n)!=-1)
{
memset(head,-1,sizeof(head));
memset(dp,0,sizeof(dp));
num=0;
for(i=2;i<=n;i++)
{
scanf("%d",&x);
addedge(i,x);
}
ans=99999999;
memset(vis,0,sizeof(vis));
dfs1(1);
memset(vis,0,sizeof(vis));
dfs2(1);
if(ans>dp[1][1])ans=dp[1][1];
for(i=1;i<=n;i++)
{
if(dp[i][1]==ans)
printf("%d ",i);
}
printf("\n");
}
return 0;
}

URAL 1056(树形DP)的更多相关文章

  1. ural 1018(树形dp)

    题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=17662 思路:典型的树形dp,处理的时候类似于分组背包,dp[i] ...

  2. Ural 1018 (树形DP+背包+优化)

    题目链接: http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=17662 题目大意:树枝上间连接着一坨坨苹果(不要在意'坨'),给 ...

  3. 树形DP URAL 1039 Anniversary Party

    题目传送门 /* 题意:上司在,员工不在,反之不一定.每一个人有一个权值,问权值和最大多少. 树形DP:把上司和员工的关系看成根节点和子节点的关系,两者有状态转移方程: dp[rt][0] += ma ...

  4. ural 1018 Binary Apple Tree(树形dp | 经典)

    本文出自   http://blog.csdn.net/shuangde800 ------------------------------------------------------------ ...

  5. URAL 1018 (金典树形DP)

    连接:1018. Binary Apple Tree Time limit: 1.0 second Memory limit: 64 MB Let's imagine how apple tree l ...

  6. 树形DP

    切题ing!!!!! HDU  2196 Anniversary party 经典树形DP,以前写的太搓了,终于学会简单写法了.... #include <iostream> #inclu ...

  7. poj 2342 Anniversary party 简单树形dp

    Anniversary party Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 3862   Accepted: 2171 ...

  8. POJ 2342 (树形DP)

    Anniversary party Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 3863   Accepted: 2172 ...

  9. hdu1520 第一道树形DP,激动哇咔咔!

    A - 树形dp Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit Sta ...

随机推荐

  1. 进入MAC下面的Library目录

    从LION后,苹果将library目录隐藏起来了,要进入那个目录,需要用到一定的技巧. 打开Finder,按下shift+command+g,输入“~/Library”(输入引号里面的),再按回车就到 ...

  2. 使用Xshell生成key,避免password登录linux

    我们通常Xshell使用命令ssh user@ip远程登录linux,这将促使我们进入password更麻烦的,通缉免费password日志的话,我们可以生成相应的key.然后把遥控器server上, ...

  3. 用反射,将DataRow行转为Object对象

    /// <summary> /// 反射辅助类 /// </summary> public class ReflectionHelper { /// <summary&g ...

  4. Linux服务器使用SSH的命令(有详细的参数解释)

    前一阵远程维护Linux服务器,使用的是SSH,传说中的secure shell. 登陆:ssh [hostname] -u user 输入密码:***** 登陆以后就可以像控制自己的机器一样控制它了 ...

  5. 12.5.3 UNIVERSAL:最终的祖先类:

    <pre name="code" class="html">12.5.3 UNIVERSAL:最终的祖先类: 你可以把 UNIVERSAL 看作最终 ...

  6. boost中asio网络库多线程并发处理实现,以及asio在多线程模型中线程的调度情况和线程安全。

    1.实现多线程方法: 其实就是多个线程同时调用io_service::run for (int i = 0; i != m_nThreads; ++i)        {            boo ...

  7. 小W与网格

    lucas定理 http://www.cnblogs.com/vongang/archive/2012/12/02/2798138.html 题目:http://hihocoder.com/conte ...

  8. <Win32_12>程序员求爱的创意程序——升级版^_^

    前段时间,我编写了一个创意程序,并用于向自己目前的女朋友表白,结果效果还不错,得到了她的芳心. 于是我将自己的创意程序共享到csdn资源上,大多数网友认为创意不错,就是简单了些——呵呵,其实我个人也这 ...

  9. <转载>Div+Css布局教程(-)CSS必备知识

    目录: 1.Div+Css布局教程(-)CSS必备知识 注:本教程要求对html和css有基础了解. 一.CSS布局属性 Width:设置对象的宽度(width:45px). Height:设置对象的 ...

  10. Mac 实用工具

    命令行常用工具: Iterm2 也是一个终端命令行工具,支持多工作区,使用清爽 http://www.iterm2.com/documentation.html 给你的命令行 代码上色 Solariz ...