FZU -2233 (并查集)
来源:互联网 发布:centos 7安装图形界面 编辑:程序博客网 时间:2024/04/27 18:41
题目传送门FZU-2233点击进行传送=—+->
题目理解
给一个 N*N 的矩阵表示两种药混合后的效果值(i,j)的值就是 i 药物与 j 药物混合的效果值。当把这n个物品分成两部分后,每部分内部材料不会相互影响,但是不同部分的材料之间会相互影响。问如何分割使得两部分材料相互之间的最小影响值最大
思路
因为材料内部不会相互影响,所以只要进可能的让混合之后效果值小的两种材料在同一部分,那么最终的得到的药物效果值就一定是尽可能大的。
具体解决
用一个结构体来保存两种药物组合和效果值,并进行排序。然后用并查集来保存药物之间的关系,按照效果值从小到大的顺序将不同的药物连成集合。如果集合只有两个了,那么显然下一个使两个集合连成一体的药物关系就是我们要找的最终结果。
代码
#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;struct Node{ int x,y,val; bool friend operator < (Node n1, Node n2) { return n1.val < n2.val; }}a[640005];int n;int pre[805];void init(){ for (int i = 0; i <= n; i++) pre[i] = i; memset(a,0,sizeof a); return;}int Find(int x){ if (x!=pre[x]) pre[x] = Find(pre[x]); return pre[x];}int cal(){ int ans = 0; for (int i = 0 ; i < n; i++) if (pre[i]==i) ans++; return ans;}int main(){ while(cin >> n) { init(); int tmp; int cnt = 0; for (int i = 0 ; i < n; i++) { for (int j = 0 ; j < n; j++) { scanf("%d",&tmp); if (i<j) { a[cnt].x = i; a[cnt].y = j; a[cnt++].val = tmp; } } } sort(a,a+cnt); for (int i = 0 ; i < cnt ; i++) { int x = Find(a[i].x); int y = Find(a[i].y); if(x==y) continue; if (cal()==2) { printf("%d\n",a[i].val); break; } else { pre[x] = y; } } } return 0;}
其实在计算并查集集合的数量的时候有两种思路
- 每次全部过一遍,计算集合数量
即:
for(i=0;i<n;i++) if(father[i]==i) count++;
先保存一下集合的总数,在每次将两个集合合并的时候把总数减一
在这里借鉴一下(想看完整代码的请戳)
for(i=0; i<k; i++) { int x = Find(a[i].x); int y = Find(a[i].y); if(x==y) continue; if(x!=y && cnt>2) { f[x] = y; cnt--; } else ans = min(ans, a[i].cost); if(ans!=INF) break; }
好弱啊,交了20遍 (逃~
1 0
- FZU -2233 (并查集)
- FZU 2233 ~APTX4869 (贪心 并查集)
- FZU 2233 ~APTX4869【贪心+并查集】
- FZU 2233 ~APTX4869(并查集)
- fzu 2233 贪心并查集
- fzu 2155 并查集的删除
- FZU 2155 删点并查集
- fzu 2059 并查集+离线处理
- FZU 2136 取糖果 (排序+并查集)
- fzu 2155 盟国 并查集的增删
- 【带删除并查集】FZU 2155——盟国
- FZU 2155 盟国(并查集的删除)
- FZU - 2155 - 盟国 (带删除的并查集~~)
- FZU 2192 位置信息挖掘 (并查集或暴力)
- 【FZU】Problem 2059 MM(离线处理并查集)
- FZU 2192 位置信息挖掘 (种类并查集)
- 福州大学月赛 FZU 2210 并查集
- FZU 2195 检查站点(并查集或者树)
- ZOJ3697-Bad-written Number
- 阅读:京东发布MySQL Group Replication官方文档中文版
- Linux的静态库制作
- ubuntu 中文件编码转换
- 九度OJ题目1047:素数判定
- FZU -2233 (并查集)
- Mybatis学习之自定义别名Typealiases(四)
- Win32 鼠标绘图代码研究
- 面向云服务编程
- JavaScript学习-私有变量
- CSU1328 近似回文词(字符串处理,最长回文子串)
- final,finalize,finally的区别
- RTS和CTS流控介绍
- 删除旧的linux-image | boot空间不足