week6 作业A 氪金带东

氪金带东

实验室里原先有一台电脑(编号为1),最近氪金带师咕咕东又为实验室购置了N-1台电脑,编号为2到N。每台电脑都用网线连接到一台先前安装的电脑上。但是咕咕东担心网速太慢,他希望知道第i台电脑到其他电脑的最大网线长度,但是可怜的咕咕东在不久前刚刚遭受了宇宙射线的降智打击,请你帮帮他。
在这里插入图片描述
提示: 样例输入对应这个图,从这个图中你可以看出,距离1号电脑最远的电脑是4号电脑,他们之间的距离是3。 4号电脑与5号电脑都是距离2号电脑最远的点,故其答案是2。5号电脑距离3号电脑最远,故对于3号电脑来说它的答案是3。同样的我们可以计算出4号电脑和5号电脑的答案是4.

Input

输入文件包含多组测试数据。对于每组测试数据,第一行一个整数N (N<=10000),接下来有N-1行,每一行两个数,对于第i行的两个数,它们表示与i号电脑连接的电脑编号以及它们之间网线的长度。网线的总长度不会超过10^9,每个数之间用一个空格隔开。

Output

对于每组测试数据输出N行,第i行表示i号电脑的答案 (1<=i<=N).

Smple Input

5
1 1
2 1
3 1
1 1

Sample Output

3
2
3
4
4

我的思路:
这道题是要求树的任意一个节点到树内其他点的最远距离。可以利用求树的直径的方法(在树中任意选择一个点,找到一个距离当前的点最远的点v0,在找到一个距离v0最远的点v1,v0-v1即是树的直径),找到v0,v1,然后分别计算v0,v1到所求点的距离,选择最大的距离,就是要得到的答案。

我的总结:
要尽量降低算法的复杂度,不然TLE就很尴尬了。。。

我的代码:

#include<cstdio>
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;

struct edg
{
	long long  dot,weight;
};

vector <edg> tree[10001];

long long n,a,b,v1,v2,vis[10001],maxn,node,ans[10001];

void init(){for(long long i=1;i<=n;i++) vis[i]=1;maxn=0;}

void dfs(long long x,long long length)
{
	vis[x]=0;
	if(length>maxn) maxn=length,node=x;
	for(long long i=0;i<tree[x].size();i++)
	{
		if(vis[tree[x][i].dot])
		{
			dfs(tree[x][i].dot,length+tree[x][i].weight);
		}
	}
	
}

void dfs1(long long x,long long length)
{
	vis[x]=0;
	if(length>maxn) maxn=length,node=x;
	for(long long i=0;i<tree[x].size();i++)
	{
		if(vis[tree[x][i].dot])
		{
			ans[tree[x][i].dot]=length+tree[x][i].weight;
			dfs1(tree[x][i].dot,length+tree[x][i].weight);
		}
	}
	
}

void dfs2(long long x,long long length)
{
	vis[x]=0;
	if(length>maxn) maxn=length,node=x;
	for(long long i=0;i<tree[x].size();i++)
	{
		if(vis[tree[x][i].dot])
		{
			ans[tree[x][i].dot]=ans[tree[x][i].dot]<(length+tree[x][i].weight)?(length+tree[x][i].weight):ans[tree[x][i].dot];
			dfs2(tree[x][i].dot,length+tree[x][i].weight);
		}
	}
	
}

int main()
{
    while(scanf("%lld",&n)!=EOF)
	{
		if(n==1)  {
		printf("0\n");continue;}
    for(long long i=2;i<n+1;i++)
    {
    	scanf("%lld%lld",&a,&b);
    	tree[i].push_back({a,b});
    	tree[a].push_back({i,b});
	}
	init();
    dfs(1,0);
    v1=node;
    init();
	ans[v1]=0;
    dfs1(v1,0);
	v2=node;
	init();
    dfs2(v2,0);
	for(long long i=1;i<=n;i++)
	{
    	printf("%lld\n",ans[i]);
	}
	for(int i=1;i<=n;i++) tree[i].clear();
	}
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值