题目链接: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;
}

最新文章

  1. 微信APP支付服务端开发Java版(一)
  2. NPOI操作excel
  3. Android Studio配置指南总结
  4. php正则预查
  5. 修改数据库表的schema,(表的[dbo.]前缀)
  6. OpenCV3编程入门笔记(2)计时函数、感兴趣区域RIO、分离/混合通道
  7. spring 4 泛型注入
  8. Myeclipse 2014破解教程
  9. 页面jquery调试的一个宝贵经验(类似于Eclipse中的写出一个对象点它的方法时候用alt加/可以跳出来它所有的方法)
  10. jmeter断言接口响应字段大小
  11. Python requests代理
  12. numpy 中的 broadcasting 理解
  13. LBS推荐系统的设计方法
  14. STM32 串口通信使用奇偶校验
  15. 为已经存在的本地项目添加git,以及从远程仓库拉取代码并切换远程分支
  16. 【js】五子棋-UI学习
  17. bitnami openedx安装的各种坑及痛苦经历
  18. rest_framework之魔法类
  19. Windows 入门杂乱无章版
  20. Loj #6164. 「美团 CodeM 初赛 Round A」数列互质

热门文章

  1. Java语言有哪些特点?
  2. hadoop 将HDFS上多个小文件合并到SequenceFile里
  3. 【刷题】BZOJ 2744 [HEOI2012]朋友圈
  4. Android 解决setRequestedOrientation之后手机屏幕的旋转不触发onConfigurationChanged方法
  5. BZOJ3173:[TJOI2013]最长上升子序列 &amp; HDU3564:Another LIS——题解
  6. 洛谷 P1966 火柴排队 解题报告
  7. HDU.1285 确定比赛名次 (拓扑排序 TopSort)
  8. pandas模块(数据分析)------Series
  9. Javascript计算世界完全对称日
  10. String类的用法