码迷,mamicode.com
首页 > 其他好文 > 详细

【CF875F】Royal Questions 最小生成基环树森林

时间:2017-12-31 14:15:19      阅读:466      评论:0      收藏:0      [点我收藏+]

标签:name   ++   line   生成   ring   getc   space   目的   stream   

【CF875F】Royal Questions

题意:国王的n个王子该结婚了!现在从外国来了m位公主,第i位公主的嫁妆是wi。由于进步思想的传播,每个公主在选择配偶的事情上是有自主权的,具体地,每个公主愿意从两个王子ai和bi中选取一个托付终生。而王子们就比较倒霉了,他们只能听从父王的安排。但是国王的目的并不在于为王子找到配偶,而是为了获得更多的嫁妆。现在国王可以任意安排哪个王子和哪个公主结婚(前提是公主愿意),并且不必为每个王子和公主都找到配偶,他想知道他最多能获得的总嫁妆是多少。

题解:标题已经暴露了一切。。。

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn=200010;
struct node
{
	int a,b,v;
}p[maxn];
int n,m,ans;
int f[maxn],tag[maxn];
bool cmp(const node &a,const node &b)
{
	return a.v>b.v;
}
inline int rd()
{
	int ret=0,f=1;	char gc=getchar();
	while(gc<‘0‘||gc>‘9‘)	{if(gc==‘-‘)	f=-f;	gc=getchar();}
	while(gc>=‘0‘&&gc<=‘9‘)	ret=ret*10+(gc^‘0‘),gc=getchar();
	return ret*f;
}
int find(int x)
{
	return (f[x]==x)?x:(f[x]=find(f[x]));
}
int main()
{
	n=rd(),m=rd();
	int i,a,b;
	for(i=1;i<=m;i++)	p[i].a=rd(),p[i].b=rd(),p[i].v=rd();
	sort(p+1,p+m+1,cmp);
	for(i=1;i<=n;i++)	f[i]=i;
	for(i=1;i<=m;i++)
	{
		a=find(p[i].a),b=find(p[i].b);
		if(a!=b&&(!tag[a]||!tag[b]))	tag[b]|=tag[a],f[a]=b,ans+=p[i].v;
		else	if(a==b&&!tag[a])	tag[a]=1,ans+=p[i].v;
	}
	printf("%d",ans);
	return 0;
}

【CF875F】Royal Questions 最小生成基环树森林

标签:name   ++   line   生成   ring   getc   space   目的   stream   

原文地址:https://www.cnblogs.com/CQzhangyu/p/8157538.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!