Computer

Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 4440    Accepted Submission(s):
2236

Problem Description
A school bought the first computer some time ago(so
this computer's id is 1). During the recent years the school bought N-1 new
computers. Each new computer was connected to one of settled earlier. Managers
of school are anxious about slow functioning of the net and want to know the
maximum distance Si for which i-th computer needs to send signal (i.e. length of
cable to the most distant computer). You need to provide this information.

Hint:
the example input is corresponding to this graph. And from the graph, you can
see that the computer 4 is farthest one from 1, so S1 = 3. Computer 4 and 5 are
the farthest ones from 2, so S2 = 2. Computer 5 is the farthest one from 3, so
S3 = 3. we also get S4 = 4, S5 = 4.

 
Input
Input file contains multiple test cases.In each case
there is natural number N (N<=10000) in the first line, followed by (N-1)
lines with descriptions of computers. i-th line contains two natural numbers -
number of computer, to which i-th computer is connected and length of cable used
for connection. Total length of cable does not exceed 10^9. Numbers in lines of
input are separated by a space.
 
Output
For each case output N lines. i-th line must contain
number Si for i-th computer (1<=i<=N).
 
Sample Input
5
1 1
2 1
3 1
1 1
 
Sample Output
3
2
3
4
4
刚开始用暴力,对每一个节点都bfs一次不出所料的LTE
题意:购置电脑,每新买一台电脑就要把它连接到购置的上一台电脑上  求所有的以任意节点为起点的一个最长路径,
        所给测试数据的意思是 :两个数a,b表示a电脑与第i+1台电脑相连,所需要的电缆的长度为b(i指的是第i行)
        如测试数据中的2 1表示2与3相连权值为1。  3 1表示电脑3与电脑4相连权值为1;
题解:用三次bfs找到最长路的两个端点u和v因为题中说每台新买的电脑都连接到上一台电脑上,所以每台电脑的
        连接都没有分叉,即节点的最长路要么是到端点u的距离要么是到端点v的距离(即取较大的那个),先用两次
        bfs找到一个端点记录下每个点到这个端点的距离,再用一次bfs找到另一个端点,再记录下每个点到这个端点的距离
        最后遍历每个点求出最长路
#include<stdio.h>
#include<string.h>
#include<queue>
#define MAX 40100
#define maxn(x,y)(x>y?x:y)
using namespace std;
int head[MAX];
int vis[MAX],dis[MAX];
int n,m,ans,ant;
int sum,beg,en;
int a[MAX],b[MAX];
struct node
{
	int u,v,w;
	int next;
}edge[MAX];
void add(int u,int v,int w)
{
	edge[ans].u=u;
	edge[ans].v=v;
	edge[ans].w=w;
	edge[ans].next=head[u];
	head[u]=ans++;
}
void getmap()
{
	int i,j,a,b;
	ans=0;
	memset(head,-1,sizeof(head));
	for(i=2;i<=n;i++)
	{
		scanf("%d%d",&a,&b);
		add(a,i,b);
		add(i,a,b);
	}
}
void bfs(int sx)
{
	int i,j;
	queue<int>q;
	sum=0;
	memset(vis,0,sizeof(vis));
	memset(dis,0,sizeof(dis));
	vis[sx]=1;
	beg=sx;
	q.push(sx);
	while(!q.empty())
	{
		int top=q.front();
		q.pop();
		for(i=head[top];i!=-1;i=edge[i].next)
		{
			int k=edge[i].v;
			if(!vis[k])
			{
				vis[k]=1;
				dis[k]=dis[top]+edge[i].w;
				q.push(k);
			}
			if(sum<dis[k])
			{
				sum=dis[k];
				beg=k;
			}
		}
	}
}
void solve()
{
	int i,j;
	memset(a,0,sizeof(a));
	memset(b,0,sizeof(b));
	bfs(1);
	bfs(beg);
	en=beg;//找到第一个端点
	for(i=1;i<=n;i++)
		a[i]=dis[i];//记录每个点到这个端点的距离
	bfs(en);//找到另一个端点
	for(i=1;i<=n;i++)
        b[i]=dis[i];//记录每个点到这个端点的距离
    for(i=1;i<=n;i++)
    {
    	ant=0;
    	ant=maxn(a[i],b[i]);
    	printf("%d\n",ant);
	}
}
int main()
{
	while(scanf("%d",&n)!=EOF)
	{
		getmap();
		solve();
	}
	return 0;
}

  

 
 
 
 
 

hdoj 2196 Computer【树的直径求所有的以任意节点为起点的一个最长路径】的更多相关文章

  1. HDOJ 2196 Computer 树的直径

    由树的直径定义可得,树上随意一点到树的直径上的两个端点之中的一个的距离是最长的... 三遍BFS求树的直径并预处理距离....... Computer Time Limit: 1000/1000 MS ...

  2. hdu 2196 Computer 树的直径

    Computer Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Problem ...

  3. 【HDU 2196】 Computer(树的直径)

    [HDU 2196] Computer(树的直径) 题链http://acm.hdu.edu.cn/showproblem.php?pid=2196 这题可以用树形DP解决,自然也可以用最直观的方法解 ...

  4. HDOJ --- 2196 Computer

    Computer Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Su ...

  5. [hdu2196]Computer树的直径

    题意:求树中距离每个节点的最大距离. 解题关键:两次dfs,第一次从下向上dp求出每个节点子树中距离其的最大距离和不在经过最大距离上的子节点上的次大距离(后序遍历),第二次从上而下dp求出其从父节点过 ...

  6. HDU 2196 Computer (树dp)

    题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=2196 给你n个点,n-1条边,然后给你每条边的权值.输出每个点能对应其他点的最远距离是多少 ...

  7. POJ 1383 Labyrinth (树的直径求两点间最大距离)

    Description The northern part of the Pyramid contains a very large and complicated labyrinth. The la ...

  8. poj1985 / poj2631(树的直径)

    poj1985 Cow Marathon 树的直径裸题 树的直径的一般求法: 任意一点为起点,dfs/bfs找出与它最远的点$u$ 以$u$为起点,dfs/bfs找出与它最远的点$v$ 则$d(u,v ...

  9. hdu4612 无向图中任意添加一条边后使桥的数量最少 / 无向图缩点+求树的直径

    题意如上,含有重边(重边的话,俩个点就可以构成了边双连通). 先缩点成树,在求数的直径,最远的连起来,剩下边(桥)的自然最少.这里学习了树的直径求法:第一次选任意起点U,进行bfs,到达最远的一个点v ...

随机推荐

  1. AngularJs 动态加载模块和依赖

    最近项目比较忙额,白天要上班,晚上回来还需要做Angular知识点的ppt给同事,毕竟年底要辞职了,项目的后续开发还是需要有人接手的,所以就占用了晚上学习的时间.本来一直不打算写这些第三方插件的学习笔 ...

  2. MVC Model数据验证

    概述 上节我们学习了Model的数据在界面之间的传递,但是很多时候,我们在数据传递的时候为了确保数据的有效性,不得不给Model的相关属性做基本的数据验证. 本节我们就学习如何使用 System.Co ...

  3. LINUX的一些常用操作

    CentOs6.7关闭防火墙(SecureCRT连接不上) 解决方法:______________________________________一.开启SSH以root用户登录Linux,打开终端, ...

  4. Javascript基本算法演练 Seek and Destroy

    转载自:http://aeroj-blog.logdown.com/posts/435808 Seek and Destroy You will be provided with an initial ...

  5. VBS基础篇 - 杂项 - Sendkeys

    VBS基础篇 - 杂项 - Sendkeys   模拟键盘操作,将一个或多个按键指令发送到指定Windows窗口来控制应用程序运行 其使用格式为:object.SendKeys(string) obj ...

  6. Android开发之漫漫长途 番外篇——内存泄漏分析与解决

    该文章是一个系列文章,是本人在Android开发的漫漫长途上的一点感想和记录,我会尽量按照先易后难的顺序进行编写该系列.该系列引用了<Android开发艺术探索>以及<深入理解And ...

  7. .net的retrofit--WebApiClient库

    # 库简介 WebApiClient是开源在github上的一个httpClient客户端库,内部基于HttpClient开发,是一个只需要定义c#接口(interface),并打上相关特性,即可异步 ...

  8. 【Coding算法导论】第4章:最大子数组问题

    Coding算法导论 本系列文章主要针对算法导论一书上的算法,将书中的伪代码用C++实现 代码未经过大量数据测试,如有问题,希望能在回复中指出! (一)问题描述 给定一个数组,求数组中连续的子数组的和 ...

  9. SQL Server性能优化(8)堆表结构介绍

    一.表结构综述 下图是SQL Server中表的组织形式(其中分区1.分区2是为了便于管理,把表进行分区,放到不同的硬盘数据文件里.默认情况下,表只有一个分区.).表在硬盘上的存放形式,有堆和B树两种 ...

  10. mysql 案例 ~ pt修复工具的使用

    简介:今天咱们来聊聊PT修复工具pt-table-sync 注意事项:   1 表要有主键或者唯一键   2 针对每一个chunk加的是for update锁   3 修复过程中不能容忍从库延迟 如果 ...