zoukankan      html  css  js  c++  java
  • poj2377Bad Cowtractors (最小生成树变形之——最大生成树)

    题目链接:http://poj.org/problem?id=2377

    Description

    Bessie has been hired to build a cheap internet network among Farmer John's N (2 <= N <= 1,000) barns that are conveniently numbered 1..N. FJ has already done some surveying, and found M (1 <= M <= 20,000) possible connection routes between pairs of barns. Each possible connection route has an associated cost C (1 <= C <= 100,000). Farmer John wants to spend the least amount on connecting the network; he doesn't even want to pay Bessie. 

    Realizing Farmer John will not pay her, Bessie decides to do the worst job possible. She must decide on a set of connections to install so that (i) the total cost of these connections is as large as possible, (ii) all the barns are connected together (so that it is possible to reach any barn from any other barn via a path of installed connections), and (iii) so that there are no cycles among the connections (which Farmer John would easily be able to detect). Conditions (ii) and (iii) ensure that the final set of connections will look like a "tree".

    Input

    * Line 1: Two space-separated integers: N and M 

    * Lines 2..M+1: Each line contains three space-separated integers A, B, and C that describe a connection route between barns A and B of cost C.

    Output

    * Line 1: A single integer, containing the price of the most expensive tree connecting all the barns. If it is not possible to connect all the barns, output -1.

    Sample Input

    5 8
    1 2 3
    1 3 7
    2 3 10
    2 4 4
    2 5 8
    3 4 6
    3 5 2
    4 5 17

    Sample Output

    42

    直接利用Kruskal算法,不过不是优先使用最小权值,而是优先使用最大权值,然后再加上并查集的知识就ok了,基本算是一道比较水的题。
    先附上AC代码:

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    using namespace std;
    struct node{
    int a,b,val;
    }nec[20005];
    int s[1010],N,M;
    int cmp(struct node A,struct node B){
    return A.val>B.val;
    }
    int find(int x){
    if(x==s[x]) return x;
    else return s[x]=find(s[x]);
    }
    void unite(int x,int y){
    s[find(x)]=find(y);
    }
    int main(){
    int sum=0;
    scanf("%d%d",&N,&M);
    for(int i=1;i<=N;i++)
    s[i]=i;
    for(int i=1;i<=M;i++)
    scanf("%d%d%d",&nec[i].a,&nec[i].b,&nec[i].val);
    sort(nec+1,nec+M+1,cmp);
    int su=0;
    for(int i=1;i<=M&&su<=N-1;i++){ //这里利用su<=N-1,可以极大缩减耗时
    if(find(nec[i].a)==find(nec[i].b)) continue;
    else sum+=nec[i].val,unite(nec[i].a,nec[i].b),su++;
    }
    /* int plug=0;
    for(int i=2;i<=N;i++)
    if(find(s[1])!=find(s[i])){
    plug=1;
    break;
    }
    if(plug) printf("-1 ");
    else printf("%lld ",sum);*/
    if(su!=N-1) printf("-1 "); //判断是否可以全部连接到,直接这么做就ojbk了,比我上面注释掉的方法好。
    else printf("%d ",sum);
    return 0;
    }


    作者:孙建钊
    出处:http://www.cnblogs.com/sunjianzhao/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

  • 相关阅读:
    多线程编程
    JQuery模板数据分组
    一些js的基本操作
    64位 ubuntu14 jdk1.7 编译 hadoop2.90 中遇到的一些问题回顾
    [错误]ClassLoaderReference class not found
    [java基础][字符串]由字符串常量池引发的思考
    my.ini修改后启动失败
    FastDFS是使用c语言编写的开源高性能分布式文件系统
    如何移除本地文件夹与Git的连接
    spring boot+mybatis plus出现Invalid bound statement (not found)
  • 原文地址:https://www.cnblogs.com/sunjianzhao/p/11463595.html
Copyright © 2011-2022 走看看