Out of Hay.

题目背景

奶牛爱干草

题目描述

Bessie 计划调查N (2 <= N <= 2,000)个农场的干草情况,它从1号农场出发。农场之间总共有M (1 <= M <= 10,000)条双向道路,所有道路的总长度不超过1,000,000,000。有些农场之间存在着多条道路,所有的农场之间都是连通的。

Bessie希望计算出该图中最小生成树中的最长边的长度。

输入格式

两个整数N和M。

接下来M行,每行三个用空格隔开的整数A_i, B_i和L_i,表示A_i和 B_i之间有一条道路长度为L_i。

输出格式

一个整数,表示最小生成树中的最长边的长度。

输入输出样例

输入 #1
3 3
1 2 23
2 3 1000
1 3 43
输出 #1
43



再来一道Kruskal

用一个while循环,判断如果有两条边是不连通的,就将它们进行合并,并且判断是不是最大的。


#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
int n,m,i,ans,p[20005],f;
struct pt{
    int pnt1;
    int pnt2;
    int length;
} a[200100];

bool cmp(pt x, pt y){
    return x.length<y.length;
}

int ch(int x){
    if(p[x]==x){
        return p[x];
    }
    p[x]=ch(p[x]);
    return p[x];
}
int main(){
    scanf("%d%d",&n,&m);
    for(i=1;i<=m;i++){
        cin>>a[i].pnt1>>a[i].pnt2>>a[i].length;
    }
    for(i=1;i<=n;i++){
        p[i]=i;
    }
    sort(a+1,a+m+1,cmp);
    i=0;
    while(f<n-1){
        i++;
        if (ch(a[i].pnt1)!=ch(a[i].pnt2)){
            p[ch(a[i].pnt1)]=ch(a[i].pnt2);
            if (ans<a[i].length){
                ans=a[i].length;
            }
            f++;
        }
    }
    printf("%d",ans);
}

 

posted @ 2019-07-08 11:06  魂兮龙游  阅读(167)  评论(0编辑  收藏  举报