树的直径 【bzoj3363】[Usaco2004 Feb]Cow Marathon 奶牛马拉松

3363: [Usaco2004 Feb]Cow Marathon 奶牛马拉松

Description

​ 最近美国过度肥胖非常普遍,农夫约翰为了让他的奶牛多做运动,举办了奶牛马拉松.马拉

松路线要尽量长,所以,告诉你农场的地图(该地图的描述与上题一致),请帮助约翰寻找两个

最远农场间的距离.

Input

​ 第1行:两个分开的整数N和M.

​ 第2到M+1行:每行包括4个分开的内容,Fi,F2,L,D分别描述两个农场的编号,道路的长

度,F1到F2的方向N,E,S,W.

Output

​ 一个整数,表示最远两个衣场间的距离.

找树的直径,水。

m和opt都是没有用的。

code

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int wx=500017;
inline int read(){
	int sum=0,f=1;char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){sum=(sum<<1)+(sum<<3)+ch-'0';ch=getchar();}
	return sum*f;
}
struct e{
	int nxt,to,dis;
}edge[wx];
int n,m,k,num;
int ans,maxn,pos;
int head[wx],dis[wx];
void add(int from,int to,int dis){
	edge[++num].nxt=head[from];
	edge[num].to=to;
	edge[num].dis=dis;
	head[from]=num;
}
void dfs(int u,int fa){
	for(int i=head[u];i;i=edge[i].nxt){
		int v=edge[i].to;
		if(v==fa)continue;
		dis[v]=dis[u]+edge[i].dis;
		dfs(v,u);
	}
}
int main(){
	n=read();read();
	for(int i=1;i<n;i++){
		int x,y,z;
		x=read();y=read();z=read();scanf("%s");
		add(x,y,z);add(y,x,z);
	}
	dfs(1,0);
	for(int i=1;i<=n;i++){
		if(maxn<dis[i]){
			maxn=dis[i];pos=i;
		}
	}
	memset(dis,0,sizeof dis);
	dfs(pos,0);
	for(int i=1;i<=n;i++){
		ans=max(ans,dis[i]);
	}
	printf("%d\n",ans);
	return 0;
}
posted @ 2018-10-10 11:26  _王小呆  阅读(343)  评论(1编辑  收藏  举报