2016陕西省ACM 热身体B 种类并查集

来源:互联网 发布:中国程序员地域分布图 编辑:程序博客网 时间:2024/04/30 07:07

Energy

发布时间: 2017年3月27日 11:31   最后更新: 2017年3月27日 18:30   时间限制: 1000ms   内存限制: 256M

人类准备发射载人飞船前往火星。

飞船使用了一种特殊的反物质燃料来作为动力,在飞船的制造期间,同时人类也在从宇宙

的各个地方收集这种反物质燃料。收集到的燃料被压缩成一些能量块存储在仓库中。

由于对反物质的特性并没有完全研究透彻,人类发现这些能量块两两之间都可能存在一种

诡异的能量排斥现象,如果不能妥善解决存储问题,将影响到未来的许多工作。

科学家建造了2 个特殊的仓库用于存放,当两块存在冲突的能量块被分别存放在两个仓

库中时,它们的排斥作用就可以忽略不计了,只需要考虑存放在同一个仓库中的能量块的排斥

情况。为了存储这些能量块,仓库需要用特殊材料制造,仓库需要承受的排斥能量越高,则建

造仓库所需要的材料也越多。

为了减少建造材料的使用,不得不重新考虑收集得到的这n 块能量块的存储分配问题。

现在,给出所有这n 块能量块之间的冲突情况,要求找到一种分配方案,使得两个仓库中

最高的冲突值最小。只要输出那个冲突值即可。

第一行是一个整数T,表示将有T 组数据。
对于每一组数据:
第一行是2 个整数n、m,分别表示能量块的数量,以及它们之间有冲突的对数;(n 
20000;m  100000) 第2 m+1 行,每行3 个整数a、b、c,表示能量块a 与能量块b 之间存
在冲突,且它们能量排斥所产生的冲突值为c。(a; b  n; 0  c  1000000000)

对于每一组数据:
首先输出“Case #x:”,x 表示当前测试数据的序号。
然后是一个整数,表示两个仓库中的最大冲突值。

 复制
14 61 4 25342 3 35121 2 283511 3 66182 4 18053 4 12884
Case #1:3512

对于以上样例说明如下:

Clipboard Image.png

采用这种方式分配存储,两个仓库中的最大冲突值为3512,其他任何方法都不会有更好的结果。


题解:

采用种类并查集

用贪心的方法,按边从大到小考虑,并把两个材料设置为不同的种类,这样的话,当检测到两个材料属于同一种类时候,直接结束。输出答案



#include <iostream>#include <algorithm>#include <cstdio>using namespace std;const int MAX = 1e5 + 5;typedef long long LL;int parent[MAX];int group[MAX];typedef pair<int,pair<int,LL> > P;P es[MAX];int find(int x){if(x == parent[x]) return x;int tmp = parent[x];parent[x] = find(parent[x]);group[x] = (group[x] + group[tmp]) % 2;return parent[x];}void init(){for(int i = 0;i < MAX;i++)parent[i] = i,group[i] = 0;}int main(){int T;scanf("%d",&T);LL cas = 0;while(T--){init();int n,m;scanf("%d%d",&n,&m);for(int i = 0;i < m;i++){int a,b;LL c;scanf("%d%d%lld",&a,&b,&c);es[i].first = -c;es[i].second.first = a;es[i].second.second = b;}sort(es,es + m);int ans = 0;for(int i = 0;i < m;i++){int c = -es[i].first;int a = es[i].second.first;int b = es[i].second.second;int fx = find(a);int fy = find(b);if(fx != fy){parent[fx] = fy;group[fx] = (group[b] - group[a] + 1)%2;}else{if(group[a] == group[b])//同一类ans = c; }if(ans) break;}printf("Case #%d:\n%lld\n",++cas,ans);}}/*24 61 4 25342 3 35121 2 283511 3 66182 4 18053 4 128844 61 4 25342 3 35121 2 283511 3 66182 4 18053 4 12884*/


1 0
原创粉丝点击