zoukankan      html  css  js  c++  java
  • 【CF875F】Royal Questions 最小生成基环树森林

    【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;
    }
  • 相关阅读:
    11.文件操作
    10.模块和包
    9.异常
    8.单例模式
    7.类属性、类方法、静态方法
    小学口算题卡---田青正
    个人技术流程(四则运算)--马伟杰
    个人开发流程(四则运算)--张文龙
    个人技术流程(四则运算)--王潮玉
    个人技术流程(四则运算)--毛明明
  • 原文地址:https://www.cnblogs.com/CQzhangyu/p/8157538.html
Copyright © 2011-2022 走看看