HDU 5627 Clarke and MST &意义下最大生成树 贪心
2024-09-27 01:40:38
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5627
题意:Bestcoder的一道题,让你求&意义下的最大生成树。
解法:
贪心,我们从高位到低位贪心,如果含有这一位的边能够构成一棵树的话,我们就可以直接把其他不含有这一位的边全部去掉
然后重复这个行为
这个贪心显然正确啦,至于判断能否构成一颗树,就用并查集就好啦
//HDU 5627 #include <bits/stdc++.h>
using namespace std;
const int maxn = 3e5+6;
int x[maxn], y[maxn], w[maxn], flag[maxn], fa[maxn];
int find_set(int x){if(x == fa[x]) return x; return fa[x] = find_set(fa[x]);}
void union_set(int x, int y){x = find_set(x), y = find_set(y); if(x!=y) fa[x] = y;}
int n, m; int main(){
int T; scanf("%d", &T);
while(T--){
scanf("%d%d", &n, &m);
for(int i = 1; i <= m; i++) scanf("%d%d%d", &x[i], &y[i], &w[i]);
int ans = 0;
for(int i = 30; i >= 0; i--){
for(int j = 1; j <= n; j++) fa[j] = j;
for(int j = 1; j <= m; j++){
if((w[j]&ans) == ans && (w[j]>>i&1)) flag[j] = 1;
else flag[j] = 0;
}
for(int j = 1; j <= m; j++){
if(flag[j]){
union_set(x[j], y[j]);
}
}
bool ok = 1;
int p = find_set(1);
for(int j = 2; j <= n; j++){
if(find_set(j) != p){
ok = 0;
}
}
if(ok) ans |= (1<<i);
}
printf("%d\n", ans);
}
return 0;
}
最新文章
- 微信APP支付服务端开发Java版(一)
- NPOI操作excel
- Android Studio配置指南总结
- php正则预查
- 修改数据库表的schema,(表的[dbo.]前缀)
- OpenCV3编程入门笔记(2)计时函数、感兴趣区域RIO、分离/混合通道
- spring 4 泛型注入
- Myeclipse 2014破解教程
- 页面jquery调试的一个宝贵经验(类似于Eclipse中的写出一个对象点它的方法时候用alt加/可以跳出来它所有的方法)
- jmeter断言接口响应字段大小
- Python requests代理
- numpy 中的 broadcasting 理解
- LBS推荐系统的设计方法
- STM32 串口通信使用奇偶校验
- 为已经存在的本地项目添加git,以及从远程仓库拉取代码并切换远程分支
- 【js】五子棋-UI学习
- bitnami openedx安装的各种坑及痛苦经历
- rest_framework之魔法类
- Windows 入门杂乱无章版
- Loj #6164. 「美团 CodeM 初赛 Round A」数列互质
热门文章
- Java语言有哪些特点?
- hadoop 将HDFS上多个小文件合并到SequenceFile里
- 【刷题】BZOJ 2744 [HEOI2012]朋友圈
- Android 解决setRequestedOrientation之后手机屏幕的旋转不触发onConfigurationChanged方法
- BZOJ3173:[TJOI2013]最长上升子序列 &; HDU3564:Another LIS——题解
- 洛谷 P1966 火柴排队 解题报告
- HDU.1285 确定比赛名次 (拓扑排序 TopSort)
- pandas模块(数据分析)------Series
- Javascript计算世界完全对称日
- String类的用法