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;
}

  

时间: 2024-08-10 09:12:55

BZOJ 3363: [Usaco2004 Feb]Cow Marathon 奶牛马拉松的相关文章

树的直径 【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 ? 一个

BZOJ 3363 POJ 1985 Cow Marathon 树的直径

题目大意:给出一棵树.求两点间的最长距离. 思路:裸地树的直径.两次BFS,第一次随便找一个点宽搜.然后用上次宽搜时最远的点在宽搜.得到的最长距离就是树的直径. CODE: #include <queue> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define MAX 80010 using namespace std; int

[BZOJ] 1631: [Usaco2007 Feb]Cow Party

1631: [Usaco2007 Feb]Cow Party Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 866  Solved: 624[Submit][Status][Discuss] Description 农场有N(1≤N≤1000)个牛棚,每个牛棚都有1只奶牛要参加在X牛棚举行的奶牛派对.共有M(1≤M≤100000)条单向路连接着牛棚,第i条踣需要Ti的时间来通过.牛们都很懒,所以不管是前去X牛棚参加派对还是返回住所,她们都采用了用时最

BZOJ 3446: [Usaco2014 Feb]Cow Decathlon( 状压dp )

水状压dp. dp(x, s) = max{ dp( x - 1, s - {h} ) } + 奖励(假如拿到的) (h∈s). 时间复杂度O(n * 2^n) ---------------------------------------------------------------------------------- #include<bits/stdc++.h> #define rep(i, n) for(int i = 0; i < n; ++i) #define clr(x

BZOJ 1631: [Usaco2007 Feb]Cow Party( 最短路 )

这道题和蔡大神出的今年STOI初中组的第二题几乎一模一样... 先跑一遍最短路 , 再把所有边反向 , 再跑一遍 , 所有点两次相加的最大值即为answer ----------------------------------------------------------------------------- #include<cstdio> #include<algorithm> #include<cstring> #include<queue> #in

BZOJ 3367: [Usaco2004 Feb]The Big Game 球赛( dp )

dp(i)表示前i个人最少坐多少辆车, dp(i) = min(dp(j) + 1, dp(i)) (0 <= j < i 且 (i, j]的人能坐在一辆车上) 时间复杂度O(n²) --------------------------------------------------------------------------- #include<bits/stdc++.h> using namespace std; const int maxn = 2509; int sum

BZOJ 1648: [Usaco2006 Dec]Cow Picnic 奶牛野餐( dfs )

直接从每个奶牛所在的farm dfs , 然后算一下.. ---------------------------------------------------------------------------------------- #include<cstdio> #include<algorithm> #include<cstring> #include<iostream> #include<vector> #define rep( i ,

bzoj 1623: [Usaco2008 Open]Cow Cars 奶牛飞车

1623: [Usaco2008 Open]Cow Cars 奶牛飞车 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 325  Solved: 223[Submit][Status][Discuss] Description 编号为1到N的N只奶牛正各自驾着车打算在牛德比亚的高速公路上飞驰.高速公路有M(1≤M≤N)条车道.奶牛i有一个自己的车速上限Si(l≤Si≤1,000,000). 在经历过糟糕的驾驶事故之后,奶牛们变得十分小心,避免碰撞的发生

BZOJ 1641: [Usaco2007 Nov]Cow Hurdles 奶牛跨栏( floyd )

直接floyd.. ---------------------------------------------------------------------------- #include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #define rep( i , n ) for( int i = 0 ;  i < n ; ++i ) #define clr( x