码迷,mamicode.com
首页 > 其他好文 > 详细

【BZOJ1509】[NOI2003]逃学的小孩 直径

时间:2017-10-15 15:15:18      阅读:169      评论:0      收藏:0      [点我收藏+]

标签:geo   namespace   ros   memset   amp   自己   string   printf   cpp   

【BZOJ1509】[NOI2003]逃学的小孩

Description

技术分享

Input

第一行是两个整数N(3 ? N ? 200000)和M,分别表示居住点总数和街道总数。以下M行,每行给出一条街道的信息。第i+1行包含整数Ui、Vi、Ti(1?Ui, Vi ? N,1 ? Ti ? 1000000000),表示街道i连接居住点Ui和Vi,并且经过街道i需花费Ti分钟。街道信息不会重复给出。

Output

仅包含整数T,即最坏情况下Chris的父母需要花费T分钟才能找到Chris。

Sample Input

4 3
1 2 1
2 3 1
3 4 1

Sample Output

4

题解:显然A和B是直径的两端点吧~(自己瞎证一下,或者瞎yy一下就行)

然后枚举C就做完了。

 

#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
const int maxn=200010;
typedef long long ll;
int n,cnt,r1,r2,rt;
ll ans;
int to[maxn<<1],next[maxn<<1],head[maxn];
ll val[maxn<<1],dep[maxn<<1],f[maxn<<1];
inline int rd()
{
	int ret=0,f=1;	char gc=getchar();
	while(gc<‘0‘||gc>‘9‘)	{if(gc==‘-‘)	f=-f;	gc=getchar();}
	while(gc>=‘0‘&&gc<=‘9‘)	ret=ret*10+gc-‘0‘,gc=getchar();
	return ret*f;
}
inline void add(int a,int b,int c)
{
	to[cnt]=b,val[cnt]=c,next[cnt]=head[a],head[a]=cnt++;
}
void dfs(int x,int fa)
{
	if(dep[x]>dep[rt])	rt=x;
	for(int i=head[x];i!=-1;i=next[i])	if(to[i]!=fa)	dep[to[i]]=dep[x]+val[i],dfs(to[i],x);
}
int main()
{
	n=rd(),rd();
	int i,a,b,c;
	memset(head,-1,sizeof(head));
	for(i=1;i<n;i++)	a=rd(),b=rd(),c=rd(),add(a,b,c),add(b,a,c);
	dfs(1,0),r1=rt;
	dep[r1]=0,dfs(r1,0),r2=rt,memcpy(f,dep,sizeof(dep));
	dep[r2]=0,dfs(r2,0);
	for(i=1;i<=n;i++)	ans=max(ans,dep[r1]+min(dep[i],f[i]));
	printf("%lld",ans);
	return 0;
}

 

【BZOJ1509】[NOI2003]逃学的小孩 直径

标签:geo   namespace   ros   memset   amp   自己   string   printf   cpp   

原文地址:http://www.cnblogs.com/CQzhangyu/p/7670215.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!