bestcoder #71 1003 找位运算的最大生成树
Clarke and MST
克拉克是一名人格分裂患者。某一天克拉克变成了一名图论研究者。 他学习了最小生成树的几个算法,于是突发奇想,想做一个位运算and的最大生成树。 一棵生成树是由n-1n−1条边组成的,且nn个点两两可达。一棵生成树的大小等于所有在生成树上的边的权值经过位运算and后得到的数。 现在他想找出最大的生成树。
第一行是一个整数T(1 \le T \le 5)T(1≤T≤5),表示数据组数。 每组数据第一行是两个整数n, m(1 \le n, m \le 300000)n,m(1≤n,m≤300000),分别表示点个数和边个数。其中n, m > 100000n,m>100000的数据最多一组。 接下来mm行,每行33个整数x, y, w(1 \le x, y \le n, 0 \le w \le 10^9)x,y,w(1≤x,y≤n,0≤w≤109),表示x, yx,y之间有一条大小为ww的边。
每组数据输出一行一个数,表示答案。若不存在生成树,输出00。
1 4 5 1 2 5 1 3 3 1 4 2 2 3 1 3 4 7
1这是一道好题,可惜我太笨,比赛的时候没做出来,虽然并不难。。。从大到小枚举位数i,如果能生成树,那么该位的生成树MST(i)一定是前一位+(1<<i),当然对树上所有的边还要满足MST(i)&w==MST(i).
#include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> #include<algorithm> #include<set> #define REP(i,a,b) for(int i=a;i<=b;i++) #define MS0(a) memset(a,0,sizeof(a))using namespace std;typedef long long ll; const int maxn=1000100; const int INF=1e9+10;int n,m; struct Edge {int u,v;ll w; };Edge e[maxn]; int fa[maxn]; int u,v; ll w;int find(int x) {return fa[x]==x?x:fa[x]=find(fa[x]); }void solve(ll t,ll &ans) {REP(i,1,n) fa[i]=i;ans+=t;REP(i,1,m){u=e[i].u,v=e[i].v,w=e[i].w;int x=find(u),y=find(v);if(x!=y&&((w&ans)==ans)) fa[x]=y;}int st=find(1);REP(i,2,n){if(find(i)!=st){ans-=t;return;}} }int main() {#ifndef ONLINE_JUDGEfreopen("in.txt","r",stdin);#endifint T;cin>>T;while(T--){scanf("%d%d",&n,&m);REP(i,1,m){scanf("%d%d%I64d",&u,&v,&w);e[i]=(Edge){u,v,w};}ll ans=0;for(int i=32;i>=0;i--){solve(1LL<<i,ans);}printf("%I64d\n",ans);}return 0; }
View Code
转载于:https://www.cnblogs.com/--560/p/5188367.html
bestcoder #71 1003 找位运算的最大生成树相关推荐
- LeetCode 389. 找不同(位运算)
1. 题目 给定两个字符串 s 和 t,它们只包含小写字母. 字符串 t 由字符串 s 随机重排,然后在随机位置添加一个字母. 请找出在 t 中被添加的字母. 2. 解题 2.1 土办法,哈希map ...
- 2018“百度之星”程序设计大赛 - 复赛 1003 带劲的and和(位运算,很好的题)
Problem Description 度度熊专门研究过"动态传递闭包问题",他有一万种让大家爆蛋的方法:但此刻,他只想出一道简简单单的题--至繁,归于至简. 度度熊有一张n个点m ...
- 位运算:找出来数组中落单的两个数
题目大意 每次给你 2 * n + 2 个的数字,除其中两个数字之外其他每个数字均出现两次,找到这两个数字并升序输出. 思路 最简答的想法,排序,然后找出只出现一次的数,不再叙述. 来说一说用位运算怎 ...
- LeetCode位运算(找出落单的数,二进制中1的个数,2的幂等)
文章目录 位运算理论+技巧介绍 1.与 & 2.异或 ^ 3.移位及综合运用(指定位置) 4.同或 开撸 1. lc136 只出现一次的数字 2. lc137 只出现一次的数字II 3. lc ...
- LeetCode刷题:位运算(找不同 和 只出现一次的数字)
1.常见的位运算 按位与&:(1&1=1,1&0=0,0&1=0,0&0=0); 按位或 | : (1 | 1=1,1 | 0=1,0 | 1=1,0 | 0= ...
- LeetCode 1275. 找出井字棋的获胜者(位运算)
1. 题目 A 和 B 在一个 3 x 3 的网格上玩井字棋. 井字棋游戏的规则如下: 玩家轮流将棋子放在空方格 (" ") 上. 第一个玩家 A 总是用 "X" ...
- JAVA程序开发按位运算的记录
忘记在哪里看到一个面试题:把int a,b的值互换,不能使用临时变量.刚开始完全懵逼,脑子里面全是浆糊,不知道如何下手.查看答案后猛地一惊,心想居然还有这种操作,真是叹为观止,真的感觉自己的基础是如此 ...
- 位运算+取某一位+java_Java位运算小节
2019新春支付宝红包技术大揭秘在线峰会将于03-07日开始,点击这里报名届时即可参与大牛互动. 位运算表达式由操作数和位运算符组成,实现对整数类型的二进制数进行位运算.位运算符可以分为逻辑运算符(包 ...
- (转)C语言位运算详解
地址:http://www.cnblogs.com/911/archive/2008/05/20/1203477.html C语言位运算详解 作者:911 说明:本文参考了http://www2.ts ...
最新文章
- BZOJ1453: [WC2005]Dface双面棋盘
- Pycharm安装pip pip安装第三方模块
- Java高并发编程(十一):Java中线程池
- 分库分表?如何做到永不迁移数据和避免热点?
- 【转】ABAP的坑1
- spring基于注解的声明式事务控制
- 【今日CV 计算机视觉论文速览 第137期】Fri, 28 Jun 2019
- 小米这个系列绝了!7款之后再添新机,完全分不清
- 电子档案管理系统java,电子政务档案管理系统 [Java/JSP] struts+hibernate+spring-DZZW - CodeBus...
- 那些软件可以测试网速,怎么测试网速 测试网速用什么软件
- Node.js的安装下载和运行JS代码和常用命令和按键
- 背包问题九讲笔记-01背包问题
- pytorch tensor索引、切片、连接——Indexing, Slicing, Joining
- 发现隐患里的自己,原来我是**人!
- 汤晓鸥教授:人工智能让天下没有难吹的牛!
- [转]XPO 条件相关类
- 进程之joinableQueue
- daimayuan每日一题#812 互质
- EU Long-term Dataset with Multiple Sensors for Autonomous Driving
- 5G移动通信标准学习笔记(一)