BZOJ_P1682 [Usaco2005 Mar]Out of Hay 乾草危機(最小生成樹)

BZOJ傳送門

Time Limit: 5 Sec Memory Limit: 64 MB
Submit: 487 Solved: 329
[Submit][Status][Discuss]
Description

The cows have run out of hay, a horrible event that must be remedied immediately. Bessie intends to visit the other farms to survey their hay situation. There are N (2 <= N <= 2,000) farms (numbered 1..N); Bessie starts at Farm 1. She’ll traverse some or all of the M (1 <= M <= 10,000) two-way roads whose length does not exceed 1,000,000,000 that connect the farms. Some farms may be multiply connected with different length roads. All farms are connected one way or another to Farm 1. Bessie is trying to decide how large a waterskin she will need. She knows that she needs one ounce of water for each unit of length of a road. Since she can get more water at each farm, she’s only concerned about the length of the longest road. Of course, she plans her route between farms such that she minimizes the amount of water she must carry. Help Bessie know the largest amount of water she will ever have to carry: what is the length of longest road she’ll have to travel between any two farms, presuming she chooses routes that minimize that number? This means, of course, that she might backtrack over a road in order to minimize the length of the longest road she’ll have to traverse.
牛們乾草要用完了!貝茜打算去勘查災情.
有N(2≤N≤2000)個農場,M(≤M≤10000)條雙向道路連接着它們,長度不超過109.每一個農場均與農場1連通.貝茜要走遍每一個農場.她每走一單位長的路,就要消耗一單位的水.從一個農場走到另一個農場,她就要帶上數量上等於路長的水.請幫她確定最小的水箱容量.也就是說,確定某一種方案,使走遍所有農場通過的最長道路的長度最小,必要時她可以走回頭路.

Input

Line 1: Two space-separated integers, N and M. * Lines 2..1+M: Line i+1 contains three space-separated integers, A_i, B_i, and L_i, describing a road from A_i to B_i of length L_i.
第1行輸入兩個整數N和M;接下來M行,每行輸入三個整數,表示一條道路的起點終點和長度.

Output

Line 1: A single integer that is the length of the longest road required to be traversed.
輸出一個整數,表示在路線上最長道路的最小值.

Sample Input
3 3
1 2 23
2 3 1000
1 3 43

Sample Output
43
由1到達2,需要經過長度23的道路;回到1再到3,通過長度43的道路.最長道路爲43

HINT

Source
Silver

Sol:
第一眼看見最大值最小不是二分嗎…
複雜度O(logMaxd NM)23333
仔細觀察其實就是記一個最大的邊,根本不用二分
最短路和最小生成樹都可以做,隨便搞一下就可以

#include<cstdio>
#include<algorithm>
using namespace std;
#define N 2005
#define M 10005
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;}
int n,m,cnt,ans;struct Edge{int u,v,d;}edge[M];int f[N];
int cmp(Edge a,Edge b){return a.d<b.d;}
int find(int x){return x==f[x]?x:f[x]=find(f[x]);}
int main(){
    n=in(),m=in();int u,v,d,f1,f2;
    for(int i=1;i<=m;i++) u=in(),v=in(),d=in(),edge[++cnt]=(Edge){u,v,d};
    sort(edge+1,edge+m+1,cmp);for(int i=1;i<=n;i++) f[i]=i;
    for(int i=1;i<=m;i++){
        u=edge[i].u,v=edge[i].v;
        f1=find(u),f2=find(v);
        if(f1!=f2) f[f2]=f1,ans=max(ans,edge[i].d);
    }
    printf("%d\n",ans);
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章