POJ2377 Bad Cowtractors【Kruskal】【求最大生成树】

Bad Cowtractors

Time Limit: 1000MS
Memory Limit: 65536K

Total Submissions: 10933
Accepted: 4614

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

Hint

OUTPUT DETAILS:

The most expensive tree has cost 17 + 8 + 10 + 7 = 42. It uses the following connections: 4 to 5, 2 to 5, 2 to 3, and 1 to 3.

Source

USACO 2004 December Silver

题目大意:Bessie要在John的N个谷仓之间修路,John要求用尽可能少的路使得所有谷仓都能

联通,并且总距离最短,但是他又不想给Bessie钱。Bessie已经意识到John可能不给他钱,所

以他就想把这个工程做的最糟糕并且不让John发现。他决定用尽可能少的路使得所有谷仓都能

联通,但是要使总距离尽可能长。求这个可能的总距离。如果不能使得所有谷仓都联通,则输

出"-1"。

思路:和最小生成树的求法类似,这里使边的权值尽可能大。用Kruskal算法来做,排序的时候,

将边从大到小排序。因为Kruskal算法过程中要先判断两点是否联通,而且边是从大到小排序,所

以如果两点间有重边,则优先选择大的加入生成树中。

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
const int MAXN = 1100;
const int MAXM = 40040;
struct EdgeNode
{
    int from;
    int to;
    int w;
}Edges[MAXM];

int father[MAXN];

int find(int x)
{
    if(x != father[x])
        father[x] = find(father[x]);
    return father[x];
}

int cmp(EdgeNode a,EdgeNode b)
{
    return a.w > b.w;
}

void Kruskal(int N,int M)
{
    sort(Edges,Edges+M,cmp);
    int ans = 0,Count = 0;

    for(int i = 0; i < M; ++i)
    {
        int u = find(Edges[i].from);
        int v = find(Edges[i].to);
        if(u != v)
        {
            ans += Edges[i].w;
            father[v] = u;
            Count++;
            if(Count == N-1)
                break;
        }
    }
    if(Count == N-1)
        cout << ans << endl;
    else
        cout << "-1" << endl;
}
int main()
{
    int N,M;
    while(~scanf("%d%d",&N,&M))
    {
        for(int i = 1; i <= N; ++i)
            father[i] = i;
        for(int i = 0; i < M; ++i)
        {
            scanf("%d%d%d",&Edges[i].from, &Edges[i].to, &Edges[i].w);
        }
        Kruskal(N,M);
    }

    return 0;
}
时间: 2024-12-17 19:18:56

POJ2377 Bad Cowtractors【Kruskal】【求最大生成树】的相关文章

kruskal求得的生成树是最小生成树的证明

给一带权连通的树一定会有至少一棵生成树,那么这些生成树中间必然会会存在至少一棵最小生成树. 假设T是用kruskal求出来的最小生成树,而U是这个图的最小生成树,如果U == T,那么证明结束. 然而如果T != U,那么至少存在一条边在T中,不在U中.那么我们希望证明T和U中所有边的权值之和是相等的.假设存在k条边存在T中不存在U中. 接下来进行k次变换: 每次将在T中不在U中的最小的边f拿出来放到U中,那么U中必然形成一条唯一的环路,我们取出这个环路上最小的且不再T中的边e放回到T中,这样的

Prim和Kruskal求最小生成树

Prim: 算法步骤: 1.任意结点开始(不妨设为v1)构造最小生成树: 2.首先把这个结点(出发点)包括进生成树里, 3.然后在那些其一个端点已在生成树里.另一端点还未在生成树里的所有边中找出权最小的一条边, 4.并把这条边.包括不在生成树的另一端点包括进生成树, …. 5.依次类推,直至将所有结点都包括进生成树为止 Pascal的渣渣代码... 注:寻找最短的边那一步可以用堆优化,但那样还不如直接用Kruskal...... Reference: http://www.nocow.cn/in

UVa1395&amp;POJ3522--Slim Span【kruskal】瓶颈生成树

链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=4141 题意:给出n个顶点,m条边,求一个生成树,使得最大边与最小边的差值最小. 思路:求一个生成树使最大边最小是瓶颈生成树.对于此题,我们枚举每一条边做最小边的情况,找对应的最小生成树的最大边,找出最大边与最小边差值最小的值即可. #include<cstring> #in

HDU6349-三原色图 Kruskal求最小生成树

三原色图 Time Limit: 1500/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total Submission(s): 353    Accepted Submission(s): 134 Problem Description 度度熊有一张 n 个点 m 条边的无向图,所有点按照 1,2,?,n 标号,每条边有一个正整数权值以及一种色光三原色红.绿.蓝之一的颜色. 现在度度熊想选出恰好 k 条

[POJ2377]Bad Cowtractors(最大生成树,Kruskal)

题目链接:http://poj.org/problem?id=2377 于是就找了一道最大生成树的AC了一下,注意不连通的情况啊,WA了一次. 1 /* 2 ━━━━━┒ギリギリ♂ eye! 3 ┓┏┓┏┓┃キリキリ♂ mind! 4 ┛┗┛┗┛┃\○/ 5 ┓┏┓┏┓┃ / 6 ┛┗┛┗┛┃ノ) 7 ┓┏┓┏┓┃ 8 ┛┗┛┗┛┃ 9 ┓┏┓┏┓┃ 10 ┛┗┛┗┛┃ 11 ┓┏┓┏┓┃ 12 ┛┗┛┗┛┃ 13 ┓┏┓┏┓┃ 14 ┃┃┃┃┃┃ 15 ┻┻┻┻┻┻ 16 */ 17 #inc

POJ2377 Bad Cowtractors 【最大生成树】

Bad Cowtractors Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10885   Accepted: 4586 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

POJ 2377 Bad Cowtractors (Kruskal)

题意:给出一个图,求出其中的最大生成树= =如果无法产生树,输出-1. 思路:将边权降序再Kruskal,再检查一下是否只有一棵树即可,即根节点只有一个 #include <cstdio> #include <iostream> #include <algorithm> #include <cstring> using namespace std; int N, M; // 节点,边的数量 struct edge { int from, to, dist;

POJ 1861 Network (Kruskal求MST模板题)

Network Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 14103   Accepted: 5528   Special Judge Description Andrew is working as system administrator and is planning to establish a new network in his company. There will be N hubs in the c

poj2377 Bad Cowtractors

思路: 最大生成树. 实现: 1 #include <iostream> 2 #include <cstdio> 3 #include <vector> 4 #include <algorithm> 5 #include <cmath> 6 using namespace std; 7 8 struct edge 9 { 10 int a, b, cost; 11 }; 12 edge es[20005]; 13 int ran[1005]; 1