poj3723(最大生成树)

原创 2016年08月29日 20:11:02

题目:点击打开链接

/*
translation:
	需要征兵女兵n人,男兵m人。征募每个人需要1w元,如果女兵x和男兵y有亲密度d。则一旦军队
	中有任意一方,则征募另外一方就可以减少d的费用。现在给出男女人数以及他们之间的亲密度,
	求征募完成所需的最少费用。

solution:
	kruskal,最大生成树。
	该题可以抽象成一个最大生成树模型。将每条边边值取负,就可求最小生成树了。之后将最小生成树的
	权值加上10000*(m+n),既是所求的答案!

note:
    并查集合并操作一定是将根合并的,一不留神容易写错。

date:
	2016.8.29
*/
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <cstring>

using namespace std;
const int maxn = 20001;

struct Edge {
	int from, to, d;
	Edge(int f_, int t_, int d_) : from(f_), to(t_), d(d_) {}
	bool operator < (const Edge &rhs) const {
		return d < rhs.d;	//从小到大
	}
};

int n, m, r;	//n girls, m boys, r relations
int pa[maxn];
vector<Edge> edges;

int get_root(int a) {
	if(pa[a] == a)	return a;
	pa[a] = get_root(pa[a]);
	return pa[a];
}

void Merge(int i, int j) {
	int r1 = get_root(i);
	int r2 = get_root(j);

	if(r1 == r2)	return;
	pa[r2] = r1;
}

int main()
{
    //freopen("in.txt", "r", stdin);
    int T;
    scanf("%d", &T);
    while(T--) {
		edges.clear();
		scanf("%d%d%d", &n, &m, &r);
		int x, y, d;
		for(int i = 0; i < r; i++) {
			scanf("%d%d%d", &x, &y, &d);
			edges.push_back(Edge(x, y + n, -d));
		}

		sort(edges.begin(), edges.end());

		//kruskal
		for(int i = 0; i < n + m; i++)	pa[i] = i;
		int res = 0;
		for(int i = 0; i < r; i++) {
			Edge e = edges[i];
			if(get_root(e.from) != get_root(e.to)) {
				Merge(e.from, e.to);
				res += e.d;
			}
		}

		int ans = 10000 * (n+m) + res;
		printf("%d\n", ans);
    }
    return 0;
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

POJ 3723 Conscription(最大生成树)

POJ 3723 Conscription(最大生成树) http://poj.org/problem?id=3723 题意: 要招n女,m男,每招一个人需要10000元,但是有一些男女有关系,代价为...
  • u013480600
  • u013480600
  • 2014年07月20日 21:12
  • 779

poj 3723 Conscription 【最大生成树|最大权森林】

题目:poj 3723 Conscription 题意:要征兵n个男兵和m个女兵,每个花费10000元,但是如果已经征募的男士兵中有和将要征募的女士兵关系好的,那么可以减少花费,给出关系,求...
  • y990041769
  • y990041769
  • 2014年12月06日 10:02
  • 3633

POJ3723 Conscription 解题报告【Kruskal/最大生成树】

POJ 3723
  • theljt
  • theljt
  • 2017年10月12日 19:26
  • 69

最大生成树与最小生成树

Fibonacci Tree Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others...
  • u012859437
  • u012859437
  • 2014年08月02日 10:56
  • 1363

POJ 2377 最大生成树 prim实现

Bad CowtractorsTime Limit: 1000MS Memory Limit: 65536KTotal Submissions: 6904 Accepted: 3008Descript...
  • xieshimao
  • xieshimao
  • 2011年02月14日 14:46
  • 5292

POJ3723最大(或者小)生成树,构建军队,不错的题目

题意:       要构建一只军队,要n个女生m个男生,征程情况下没增加一个人的花费是1W,但是因为一些拉拢关系,比如 x y d表示如果x女和y男之间有一个已经进了军队,那么另一个进军队的时候就可...
  • u013761036
  • u013761036
  • 2015年03月16日 16:53
  • 619

POJ 2377 Bad Cowtractors(最大生成树—prim算法)

Bad Cowtractors Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 12441 ...
  • zwj1452267376
  • zwj1452267376
  • 2016年01月14日 16:58
  • 574

hdu3367Pseudoforest (最大生成树之kruskal 算法)

Problem Description In graph theory, a pseudoforest is an undirected graph in which every connected...
  • u010372095
  • u010372095
  • 2013年08月17日 23:35
  • 2866

POJ 2377 (最大生成树 Kruskal)

Bad Cowtractors Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 13469   Accepted:...
  • qq_33406883
  • qq_33406883
  • 2016年07月30日 21:02
  • 436

(poj 2377)Kruskal算法 最大生成树

这道题只是一道模板题,感到唯一的坑点就是n,m容易打错,一定要注意结构体要开到Max(M)+n; 之前便是因为这个地方Runtime Error了两次;顺便注意最后输出的答案 为long long型题...
  • Puppet__
  • Puppet__
  • 2017年07月22日 16:07
  • 285
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:poj3723(最大生成树)
举报原因:
原因补充:

(最多只允许输入30个字)