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

Posted 北屿

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了BZOJ 3363: [Usaco2004 Feb]Cow Marathon 奶牛马拉松相关的知识,希望对你有一定的参考价值。

Description

给你一个图,两个点至多有一条路径,求最长的一条路径. \(n \leqslant 4\times 10^4\)

Sol

DFS?DP?

这就是一棵树,方向什么的都没用...

然后记录一下到这个点的最大值和次大值更新答案即可.

Code

/**************************************************************
    Problem: 3363
    User: BeiYu
    Language: C++
    Result: Accepted
    Time:116 ms
    Memory:5572 kb
****************************************************************/
 
#include<cstdio>
#include<vector>
#include<utility>
#include<iostream>
using namespace std;
 
#define mpr make_pair
typedef pair< int,int > pr;
const int N = 40005;
 
int n,m,ans;
vector<pr> g[N];
int mx1[N],mx2[N],b[N];
 
inline int in(int x=0,char ch=getchar()){ while(ch>‘9‘ || ch<‘0‘) ch=getchar();
    while(ch>=‘0‘ && ch<=‘9‘) x=(x<<3)+(x<<1)+ch-‘0‘,ch=getchar();return x; }
void DFS(int u,int fa){
    b[u]=1;
    for(int i=0,v,d;i<g[u].size();i++) if((v=g[u][i].first)!=fa){
        DFS(v,u),d=g[u][i].second;
        if(mx1[v]+d>mx1[u]) mx2[u]=mx1[u],mx1[u]=mx1[v]+d;
        else if(mx1[v]+d>mx2[u]) mx2[u]=mx1[v]+d; 
    }ans=max(ans,mx1[u]+mx2[u]);
}
int main(){
    n=in(),m=in();
    for(int i=1,u,v,w;i<=m;i++){
        u=in(),v=in(),w=in();
        g[u].push_back(mpr(v,w)),g[v].push_back(mpr(u,w));
    }
    for(int i=1;i<=n;i++) if(!b[i]) DFS(i,-1);
    cout<<ans<<endl;
    return 0;
}

  

以上是关于BZOJ 3363: [Usaco2004 Feb]Cow Marathon 奶牛马拉松的主要内容,如果未能解决你的问题,请参考以下文章

bzoj3362/3363/3364/3365[Usaco2004 Feb]树上问题杂烩 并查集/树形dp/LCA/树的点分治

BZOJ 3364: [Usaco2004 Feb]Distance Queries 距离咨询

bzoj3367[Usaco2004 Feb]The Big Game 球赛*

BZOJ_3362_[Usaco2004 Feb]Navigation Nightmare 导航噩梦_并查集

BZOJ 3362: [Usaco2004 Feb]Navigation Nightmare 导航噩梦

BZOJ 3365: [Usaco2004 Feb]Distance Statistics 路程统计