T3 贸易

3.1 description
小 H 因为擅长跑步,成为了一名出色的记者。
这天,他又被邀请去西方国家做报道,这次上面派给他的任务是要去搞清楚各个西方国家之
间的贸易关系,从而了解历史的进程。
小 H 查阅了资料,他发现两个国家之间如果存在贸易关系,那么一定是单向的,也就是说,
如果 i 和 j 两个国家之间的存在贸易关系,那么要么是 i 向 j 出口货物,要么是 j 向 i 出口货
物,两个国家不能同时向对方出口货物。
同时小 H 了解到,两个西方国家之间要进行贸易,必须先要得到西方联盟的认可,要想得到
认可,就必须给西方联盟一点好处费。也就是说,两个国家 i, j 之间如果存在 i 向 j 出口或者 j
向 i 出口的关系,需要付出一定的代价。
西方资本家为了省钱,会保证最后形成的贸易网络中任何一个国家只会从一个国家入口,但
是为了卖得更多,一个国家可能同时向很多国家出口,当然也可能不向任何一个国家出口。
现在小 H 已经知道了哪些国家之间可能会存在贸易关系,不过他意识到,有很多种方法可以
满足西方资本家的要求。但根据他的经验,西方资本家只会选择向西部联盟付好处费最少的一种
方法。于是他找到了你,想让你帮他找出一种满足西方资本家要求的好处费最少的方案,如果任
何一种方案都不能满足西方资本家的要求,则输出 ”No”。
3.2 input
第一行两个数 n, m,表示一共有 n 个国家,可能有 m 对国家存在贸易关系。
接下来 m 行,每行三个数 ai
, bi
, ci,表示一对可能存在贸易关系的国家 ai
, bi,和这个贸易关
系得到认可需要付出的好处费 ci,保证 ai ̸= bi。
3.3 output
输出一个数,表示满足西方资本家要求的好处费最少的一种方案的好处费。
3.4 sample input 1
4 5
1 2 1
1 3 2
3 2 3
2 4 4
3 4 4
3.5 sample output 1
10
3.6 note
一种可能的方法:几种被确定的贸易关系分别为 1 → 2, 2 → 3, 3 → 1, 2 → 4。
另一种可能的方法:几种被确定的贸易关系分别为 3 → 4, 1 → 3, 3 → 2, 2 → 1。
3.7 sample input 2
3 2
1 2 1
1 3 2
3.8 sample output 2
No
3.9 data range
对于 10 % 的数据,n, m ≤ 20。
对于 30 % 的数据,n, m ≤ 200。
对于 60 % 的数据,n, m ≤ 5000
对于 100 % 的数据,n, m ≤ 5 ∗ 105。
5
1≤ci≤2*10^9

最初的想法:
tarjan缩点+最小生成树(50分)
每个强连通分量中选最小生成树加一条不在树上的最小边

然而…
树+树=>一颗基环树(两树间连)||两颗基环树(两树间不连)

正解:
并查集
所有边从小到大排序,选最小边,边上两点。
1.两点同树:
(1)为基环树,不加;
(2)为树,加,变基环树,做标记;
2.两点不同树:
(1)都为基环树,不加;
(2)都为树,加,变一颗树,合并;
(3)一个为基环树,一个为树,加,变一颗基环树,合并,做标记。

标程:

#include<bits/stdc++.h>
#define LL long long
using namespace std;const int A=1e6+5;LL n,m;
LL f[A];
LL res;
bool tree[A];struct gg
{LL a,b,w;
};gg road[A];bool comp(const gg &a,const gg &b)
{return a.w<b.w;
}int find(LL x)
{if(x==f[x])  return x;f[x]=find(f[x]);return f[x];
}void hb(LL x,LL y)
{LL xx=find(x),yy=find(y);if(xx!=yy) f[xx]=yy;
}int main()
{scanf("%lld%lld",&n,&m);for(int i=1;i<=n;i++) f[i]=i;for(int i=1;i<=m;i++)scanf("%lld%lld%lld",&road[i].a,&road[i].b,&road[i].w);sort(road+1,road+1+m,comp);for(int p=1;p<=m;p++){int x=find(road[p].a),y=find(road[p].b),z=road[p].w;if(x==y){if(tree[x])   continue;else{res+=z;tree[x]=1;continue;}}else{if(tree[x]&&tree[y])  continue;if(tree[x]&&!tree[y]){res+=z;hb(x,y);x=find(road[p].a),y=find(road[p].b);tree[x]=1;continue;}if(!tree[x]&&tree[y]){res+=z;hb(x,y);x=find(road[p].a),y=find(road[p].b);tree[x]=1;continue;}if(!tree[x]&&!tree[y]){res+=z;hb(x,y);continue;}}}printf("%lld",res);return 0;
}

20191009 csp-s模拟T3(并查集)相关推荐

  1. 牛客多校3 - Operating on a Graph(并查集+链表合并)

    题目链接:点击查看 题目大意:给出一个由 n 个点和 m 条边组成的无向图,每个点初始时都有颜色 i ,i ∈ [ 0 , n - 1 ] ,接下来有 q 次操作,每次操作会给出一种颜色 x ,分两种 ...

  2. 并查集 ---- 扩展域并查集判二分图 + 循环模拟字典树 The 2020 ICPC Asia Macau Regional Contest C. Club Assignment (详解)

    题目链接 题目大意: 有n个数,现在要把他们拆分成两个集合,假设S为集合,有如下定义: f(S)={min(x⊕y)∣x,y∈S,andx!=y}f(S)=\{min(x\oplus y)|x,y\i ...

  3. HDU-3974 Assign the task 线段树 或 直接模拟多叉树 或 并查集 (三种方法)

    题目大意 t 组数据(t<=10),每组第一行一个 n 表示 n 个员工(n<=5e4),接下来 n-1 行,每行两个整数 u,v 表示 v 是 u 的上司 然后一行 m 表示有 m 个操 ...

  4. 并查集是什么?怎么模拟实现?如何应用?

    目录 一.什么是并查集? 二.并查集可以解决哪些问题? 三.并查集的模拟实现 3.1.并查集的定义 3.2.查询两个元素是否是同一个集合 3.3.合并两个集合 3.4.求集合个数 3.5.并查集完整代 ...

  5. Day10 堆排序、模拟堆 trie树(字典树) 并查集

    堆呢就是一棵树完全二叉树... 小根堆的话,根节点就是最小值 维护堆只有两个操作 up(k) down(k) cnt是堆的大小 建堆的话只需要把前n/2的数down下来就ok 复杂度是小于O(n) 的 ...

  6. zcmu 1603 卡斯丁狗的战舰帝国(并查集+模拟)

    思路:看到题目我只知道,普通的暴力模拟是不行的,但是不知道用什么办法优化,然后看到网上的大佬们用了并查集恍然大悟: 用并查集维护每条船攻击后的根节点,最后输出查询位置的根节点就行,如果在期间存在该位置 ...

  7. 【洛谷P4997】不围棋【并查集】【模拟】

    题目大意: 题目链接:https://www.luogu.org/problemnew/show/P4997 「不围棋」是一种非常有趣的棋类游戏. 大家都知道,围棋的「气」是指一个棋子所在的联通块相邻 ...

  8. 【并查集】【模拟】家谱

    题目: 现代的人对于本家族血统越来越感兴趣, 现在给出充足的父子关系, 请你编写程序找到 某个人的最早的祖先. 输入: 输入文件由多行组成, 首先是一系列有关父子关系的描述, 其中每一组父子关系由二行 ...

  9. jzoj5904. 【NOIP2018模拟10.15】刺客信条(并查集)

    5904. [NOIP2018模拟10.15]刺客信条 Description 故事发生在1486 年的意大利,Ezio 原本只是一个文艺复兴时期的贵族,后来因为家族成员受到圣殿骑士的杀害,决心成为一 ...

  10. 【牛客NOIP模拟】牛半仙的魔塔(增强版)【贪心】【并查集】

    题意:一个魔塔游戏的地图是一棵以 111 为根的树,起点为根,除根外每个结点有一个怪物,给定每个怪物血量.攻击.防御.奖励蓝宝石个数(加防御),勇士的血量.攻击.防御,遇到怪物必须战斗,勇士永远先手, ...

最新文章

  1. 极米亮相CES展 首推3000元内1080p无屏电视
  2. java实现遍历树形菜单方法——service层
  3. Angular学习记录一
  4. docker学习------centos7.5下的swarm集群可视化构建
  5. Java 8 Optional 类
  6. 资深数据产品经理陈家崑:如何从 0 到 1 构建埋点体系
  7. winform 后台线程更新UI
  8. 让机器学会看图说话:Image Caption任务最新综述
  9. jQuery之过滤选择器
  10. .NET Core下使用gRpc公开服务(SSL/TLS)
  11. python内置的数字运算函数_Python 内置函数1
  12. webpack 读取文件夹下的文件_webpack基本介绍及使用
  13. Jstatd命令(Java Statistics Monitoring Daemon)
  14. linux/unix 基本概念的认识(sha-bang 、PPA)
  15. 吞吐量、响应时间和 CPU 利用率之间的关系
  16. 苹果手机上网很慢_手机信号满格,但上网速度却很慢?来听听通信专家怎么说的...
  17. AutoJs学习-图灵QQ自动聊天机器人
  18. Linux 创建用户角色并添加ssh登录权限
  19. jquery 的税收计算器(仅限参考)
  20. Doclist压缩方法简介

热门文章

  1. HNUST Java 数据库系统课程设计:学生管理系统
  2. poi操作word模板替换数据并且导出word
  3. 牛尔新视点:關於醫學美容相關问答
  4. 学习华为云人脸识别踩坑,The subservice has not been subscribed和FRS.0020错误,projectId的获取
  5. 完全演示在虚拟机中装Windows7
  6. nginxlocation打印自定义日志
  7. 基于NW实现的前端桌面应用
  8. 双摄测距原理_双摄像头系列原理深度剖析
  9. 服务器数据库只读怎么修改权限,设置mysql数据库为只读权限
  10. css 3d环形,CSS3 飞行的3D圆环