树的直径 【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;
}

猜你喜欢

转载自www.cnblogs.com/wangxiaodai/p/9765385.html