poj 2377 Bad Cowtractors

Bad Cowtractors

Time Limit: 1000MS   Memory Limit: 65536K
Total Submissions: 10194   Accepted: 4333

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

题意:给定每条路线间需要的费用,建造一个最贵的网络线路(任意两节点都可以互相达到,但是不存在回路),求最多需要花费多少钱。

思路:最大生成树。

#include<stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;
#define M 1500000
int f[M];
int sum,t;
struct node
{
	int x,y,l;
}p[M],v[M];

bool cmp(node a,node b)
{
	return (a.l>b.l);
}

void Init (int n)
{
	for(int i=1;i<=n;i++)
		f[i]=i;
}

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

int Union(int x,int y,int z)
{
	int fx,fy;
	fx=find(x);
	fy=find(y);
	if(fx!=fy)
	{
		f[fy]=fx;
		sum+=z;
		t++;
	}
    return sum;
}

int main ()
{
	int n,m;
	int i;
	while(cin>>n>>m)
	{
		Init(n);
		memset(p,0,sizeof(p));
		sum=0;
		t=0;
		for(i=0;i<m;i++)
			cin>>p[i].x>>p[i].y>>p[i].l;

		sort(p,p+m,cmp);

		for(i=0;i<m;i++)
		  Union(p[i].x,p[i].y,p[i].l);

		if(t==n-1)
			cout<<sum<<endl;
		else
			cout<<"-1"<<endl;
	}
	return 0;
}

poj 2377 Bad Cowtractors,布布扣,bubuko.com

时间: 2024-12-12 23:20:03

poj 2377 Bad Cowtractors的相关文章

POJ 2377 Bad Cowtractors【最大生成树,Prime算法】

Bad Cowtractors Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 13628   Accepted: 5632 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(最大生成树)

http://poj.org/problem?id=2377 bessie要为FJ的N个农场联网,给出M条联通的线路,每条线路需要花费C,因为意识到FJ不想付钱,所以bsssie想把工作做的很糟糕,她想要花费越多越好,并且任意两个农场都需要连通,并且不能存在环.后面两个条件保证最后的连通图是一棵树. 输出最小花费,如果没办法连通所有节点输出-1. 最大生成树问题,按边的权值从大道小排序即可,kruskal算法可以处理重边的情况,但是在处理的时候,不能仅仅因为两个节点在同一个连通子图就判断图不合法

poj 2377 Bad Cowtractors(最大生成树!)

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 route

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 - 2377 - Bad Cowtractors (最小生成树)

题目链接:https://vjudge.net/problem/POJ-2377#author=tsacm123 题目大意:就是让你算出n个谷仓之间的最大生成树,然后把各条边的值累加起来 #include<set> #include<map> #include<stack> #include<queue> #include<cmath> #include<cstdio> #include<cctype> #include&

Bad Cowtractors POJ - 2377

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 pa

POJ 2377(最大生成树)

http://poj.org/problem?id=2377 题意:现在有一个人给人修建一些线路,(当然,我们想要少花钱消费,人家就想多多赚你的钱了,现在就给出这么一个问题).让你求修得所有电路能赚取的最大利润,若电路不能被全部修完,输出“-1”. 分析:最小生成树模板改一改就好啦~ #include <stdio.h> #include <algorithm> #include <string.h> using namespace std; #define maxn

poj 2377

题意: 最大生成树 思路: 最大生成树 code: #include<cstdio> #include<iostream> #include<cstring> #include<algorithm> #include<vector> #include<string> #include<queue> #include<map> #include<set> #include<cmath> u

poj 2377 拉最长的线问题 kruskal算法

题意:建光纤的时候,拉一条最长的线 思路:最大生成树 将图的n个顶点看成n个孤立的连通分支,并将所有的边按权从大到小排 边权递减的顺序,如果加入边的两个端点不在同一个根节点的话加入,并且要将其连通,否则放弃 最后剩下一个连通支 解决问题的代码: #include<cstdio> #include<iostream> #include<cstring> #include<algorithm> #include<cmath> #include<