zoukankan      html  css  js  c++  java
  • [Usaco2005 Mar]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。

    输出格式

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


    要把所有点连通,不难想到我们需要构建一棵生成树。

    题目要求最长边最短,我们根据Kruskal的贪心思想,可以对边排序之后优先加小的边,用并查集维护生成树,最后加入的边就是答案。

    时间复杂度为O(MlogM)

    #include<algorithm>
    #include<iostream>
    #include<cstring>
    #include<cstdio>
    #define maxn 2001
    #define maxm 10001
    using namespace std;
    int n,m;
    inline int read(){
        register int x(0),f(1); register char c(getchar());
        while(c<'0'||'9'<c){ if(c=='-') f=-1; c=getchar(); }
        while('0'<=c&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();
        return x*f;
    }
    
    struct edge{
        int u,v,w;
        bool operator<(const edge &e)const{ return w<e.w; }
    }e[maxm];
    int fa[maxn],ans;
    int get(int x){ return fa[x]==x?x:fa[x]=get(fa[x]); }
    inline void kruskal(){
        sort(e+1,e+1+m);
        for(register int i=1;i<=n;i++) fa[i]=i;
        for(register int i=1;i<=m;i++){
            int u=e[i].u,v=e[i].v,w=e[i].w;
            if(get(u)==get(v)) continue;
            fa[get(u)]=get(v),ans=w;
        }
    }
    
    int main(){
        n=read(),m=read();
        for(register int i=1;i<=m;i++) e[i].u=read(),e[i].v=read(),e[i].w=read();
        kruskal();
        printf("%d
    ",ans);
        return 0;
    }
    
  • 相关阅读:
    GhostBSD 3.0RC3,基于GNOME的FreeBSD
    Nagios 3.4.3 发布,企业级监控系统
    Jolokia 1.0.6 发布, JMX远程访问方法
    微软希望开发人员不要使 WebKit 成为新版 IE6
    Kwort Linux 3.5 正式版发布
    EJDB 1.0.24 发布,嵌入式 JSON 数据库引擎
    Pale Moon 15.3 Firefox“苍月”优化版发布
    Galera Load Balancer 0.8.1 发布
    SmartSVN V7.5 正式发布
    PostgresQL建立索引如何避免写数据锁定
  • 原文地址:https://www.cnblogs.com/akura/p/11066869.html
Copyright © 2011-2022 走看看