征兵

【题目描述】:

一个国王,他拥有一个国家。最近他因为国库里钱太多了,闲着蛋疼要征集一只部队要保卫国家。他选定了N个女兵和M个男兵,但事实上每征集一个兵他就要花10000RMB,即使国库里钱再多也伤不起啊。他发现,某男兵和某女兵之间有某种关系(往正常方面想,一共R种关系),这种关系可以使KING少花一些钱就可以征集到兵,不过国王也知道,在征兵的时候,每一个兵只能使用一种关系来少花钱。这时国王向你求助,问他最少要花多少的钱。

【输入描述】:

第一行:T,一共T组数据。

接下来T组数据,

第一行包括N,M,R

接下来的R行 包括Xi,Yi,Vi 表示如果招了第Xi个女兵,再招第Yi个男兵能省Vi元(同样表示如果招了第Yi个男兵,再招第Xi个女兵能也省Vi元)

【输出描述】:

共T行,表示每组数据的最终花费是多少(因为国库里的钱只有2^31-1,所以保证最终花费在maxlongint范围内)

【样例输入】:

2
5 5 8
4 3 6831
1 3 4583
0 0 6592
0 1 3063
3 3 4975
1 3 2049
4 2 2104
2 2 781
5 5 10
2 4 9820
3 2 6236
3 1 8864
2 4 8326
2 0 5156
2 0 1463
4 1 2439
0 4 4373
3 4 8889
2 4 3133

【样例输出】:

71071
54223

【时间限制、数据范围及描述】:

时间:1s 空间:128M

T<=5 ,m,n<=10000,r<=50000,Xi<=m,Yi<=n,Vi<=10000,结果<=2^31-1

吐槽一下,一个士兵只能发生一种关系我一直以为两个士兵只能用一种省钱方式。。。

其实这题意思就是两个士兵有某种关系,就像两点之间有一条的路一样,每个点要找一个划算的点连起来,要在所有操作找一种总和最大的方案。那个因为上次最小生成树不太懂并查集是什么,所以自己用贪心做的,后来知道那是prim算法。这题最大生成树,我想了一下应该也是可以用贪心做的,但为了学习并查集我就不那样写了。(最小生成树我写的贪心也可以参考一下点击打开链接)

这里首先处理一下,把男兵放到女兵数组后面去,形成a[1]~a[m+n]。然后给所有操作排个序(其实这也是贪心,prim算法
以点为中心,而kruska算法是以边为中心的)。之后从钱最多的开始,每次看两个端点是否在一个集合,如果不在说明连起来是很完美的。如果在的话,那么你就无法选择了,因为不能连成一个环,这样等于有一个士兵用了两种省钱方式。

所以我们需要用并查集,可以理解为是用一个符号代表这个集合,初始值就是自身,合并后就对其进行修改(相当于收了个小弟),
需要查询时就用一个递归上层找,直到找到集合最初的老大。如果结果相同就是在一个集合,否则就可以进行修改并累加ans.

int find(int x)

{return x==f[x]?x:f[x]=find(f[x]);}   f[]就是记录他们的所在集合的,这样的递归就可以搜索的该端点所在集合了

for(int i=1;i<=r;i++)
    {
       int p=find(a[i].x),q=find(a[i].y);
       if(p!=q) 
            {f[p]=q,ans+=a[i].v;}
            }

这就是中心程序了,找到两个端点所在集合,不在一起的话就给他们连起来,怎么连呢,就是用f[]数组修改,就好比养了个小弟了。

具体还是需要看程序的

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cstring>
#define inf 0x7fffffff
#define ll long long
using namespace std;
ll T,n,m,r;
int f[20005];struct node{int x,y,v;
}a[50005];bool cmp(node a,node b)
{return a.v>b.v;}int find(int x)
{return x==f[x]?x:f[x]=find(f[x]);}//查询 int main()
{//freopen("test1.in","r",stdin);//freopen("test1.out","w",stdout);cin>>T;while(T--){ll ans=0;cin>>n>>m>>r;for(int i=1;i<=n+m;i++)f[i]=i;//并查集的初始化 for(int i=1;i<=r;i++){cin>>a[i].x>>a[i].y>>a[i].v;a[i].x++;a[i].y++;a[i].y+=n;}    //输入后整理 sort(a+1,a+r+1,cmp);//按从大到小排序 for(int i=1;i<=r;i++){int p=find(a[i].x),q=find(a[i].y);//p,q是所在集合 if(p!=q) //不在一个集合 {f[p]=q;//进行修改,合并啦 ans+=a[i].v;//加上这次省的钱 }}printf("%d\n",(n+m)*10000-ans);}return 0;
}

4th 【最小生成树并查集】征兵相关推荐

  1. hdu 1233 还是畅通工程 Kruskal 最小生成树 并查集

    题目地址: http://acm.hdu.edu.cn/showproblem.php?pid=1233 模板题,kruskal求最小生成树. 并查集是个好东西啊  就是注意一点 输入边的信息时,角标 ...

  2. hdu 1232 畅通工程 最小生成树 并查集

    1232的连接:http://acm.hdu.edu.cn/showproblem.php?pid=1232 #include <iostream>#include <cstdio& ...

  3. UOJ14 UER #1 DZY Loves Graph(最小生成树+并查集)

    显然可以用可持久化并查集实现.考虑更简单的做法.如果没有撤销操作,用带撤销并查集暴力模拟即可,复杂度显然可以均摊.加上撤销操作,删除操作的复杂度不再能均摊,但注意到我们在删除时就可以知道他会不会被撤销 ...

  4. jzoj3237-间谍派遣【最小生成树,并查集】

    正题 题目大意 一张图,第iii个点参加任务需要mkimk_imki​元,连接一条边需要一定费用,要求每个联通图都有参加任务的点,求最小费用. 解题思路 其实就是求若干个最小生成树然后这个最小生成树的 ...

  5. jzoj2940-生成输入数据【最小生成树,并查集】

    正题 题目大意 给一个完全图的唯一一颗最小生成树,求完全图最小边权之和. 解题思路 我们考虑在计算最小生成树的时候,将两个联通块合并时,我们会选择连接这两个联通块的最小的边. 那么我们就可以让每个联通 ...

  6. 村村通工程 最小生成树+并查集

    问题 D: 村村通工程 时间限制: 1 Sec 内存限制: 128 MB 题目描述 某国有N个村子,M条道路,为了实现"村村通工程",现在要"油漆"N-1条道路 ...

  7. UVa1395(最小值最小生成树+并查集)

    //思路:用结构体保存一条边的信息(u,v,w),因为是求最小的生成树,所以把边排序后,从最小的边(起点)依次枚举可以构成的生成树 AC源码: #include <cstdio> #inc ...

  8. LeetCode 1489. 找到最小生成树里的关键边和伪关键边(并查集+kruskal最小生成树)

    文章目录 1. 题目 2. 解题 1. 题目 给你一个 n 个点的带权无向连通图,节点编号为 0 到 n-1 ,同时还有一个数组 edges ,其中 edges[i] = [fromi, toi, w ...

  9. 最小生成树——洛谷并查集、口袋的天空

    最小生成树--并查集 简单模板题-洛谷3367并查集 题目描述 如题,现在有一个并查集,你需要完成合并和查询操作. 输入格式 第一行包含两个整数 N,MN,M ,表示共有 NN 个元素和 MM 个操作 ...

最新文章

  1. centos6.5命令安装redis并设置redis自启动,可远程连接
  2. python 在无网络环境下安装包
  3. html页面判断其他div为空,将外部html加载到div中 - 页面加载然后变为空白
  4. 区块链经济时代得“先机”者得天下!
  5. 自己写的程序发给别人老是会出现缺失各种库,而自己电脑运行却没毛病
  6. java中 hashmap中小数,java基础知识--HashMap中对 h(length-1)的理解
  7. 作为一名Java开发者应该掌握的基础知识汇总!
  8. VTK:可视化算法之ExponentialCosine
  9. android手机如何安装apk文件,如何安装APK文件到自己的android手机里?.doc
  10. Java 基础【09】你的多继承纳?
  11. [蓝桥杯][算法提高VIP]数的划分-dp
  12. Update your Twitter status using php
  13. mybais逆向工程快速生成实体和基本xml
  14. 【Clickhouse】Clickhouse 整合 Prometheus 监控 运行时状态
  15. matlab有限差分法编程波导_有限差分法的Matlab程序
  16. php 每日一句名人名言,每日一句人生格言
  17. ORACLE AWR简介
  18. centos6.5系统执行mv /* /path,只能用cd命令,如何恢复
  19. 计算机课题立项申报书范文,课题立项申请书怎么写
  20. STM32F103ZET6(野火霸道v2)串口烧录(mcuisp)

热门文章

  1. The signing key‘s size is 1024 bits which is not secure enough for the RS256 algorithm.
  2. Arturia V Collection 9 for mac - Arturia系列合成器合集
  3. kanzi案例Coin
  4. 金山云个人用户实名认证步骤详解(图文教程)
  5. 复制链接到safari浏览器打开,如何从Safari浏览器获取网址
  6. Realtime Multi-Person 2D Pose Estimation Using Part Affinity Fields【菜鸟读者】
  7. Elasticsearch 7.X RESTful 风格 高级查询
  8. MySQL查看数据库数据量
  9. 怎么用Java解二元方程_正则表达式解二元方程式代码
  10. Springboot Mybatis MySQL读写分离及事物配置