• 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/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

  • 相关阅读:
    Selenium(三)webdriver的API与定位元素
    代码验证和动手动脑
    课程作业01实验报告1,2,3
    动手动脑
    课程作业03实验报告
    课程作业02实验报告
    猜数字实验报告
    java各种问题总结和一些讨论
    java从命令行接受多个数字并求和
    java登陆界面实验报告
  • 原文地址:https://www.cnblogs.com/sunjianzhao/p/11463595.html
Copyright © 2020-2023  润新知