Clarke and MST

 Accepts: 33
 Submissions: 92
 Time Limit: 2000/1000 MS (Java/Others)
 Memory Limit: 65536/65536 K (Java/Others)

问题描述
克拉克是一名人格分裂患者。某一天克拉克变成了一名图论研究者。
他学习了最小生成树的几个算法,于是突发奇想,想做一个位运算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≤10​9​​),表示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 找位运算的最大生成树相关推荐

  1. LeetCode 389. 找不同(位运算)

    1. 题目 给定两个字符串 s 和 t,它们只包含小写字母. 字符串 t 由字符串 s 随机重排,然后在随机位置添加一个字母. 请找出在 t 中被添加的字母. 2. 解题 2.1 土办法,哈希map ...

  2. 2018“百度之星”程序设计大赛 - 复赛 1003 带劲的and和(位运算,很好的题)

    Problem Description 度度熊专门研究过"动态传递闭包问题",他有一万种让大家爆蛋的方法:但此刻,他只想出一道简简单单的题--至繁,归于至简. 度度熊有一张n个点m ...

  3. 位运算:找出来数组中落单的两个数

    题目大意 每次给你 2 * n + 2 个的数字,除其中两个数字之外其他每个数字均出现两次,找到这两个数字并升序输出. 思路 最简答的想法,排序,然后找出只出现一次的数,不再叙述. 来说一说用位运算怎 ...

  4. LeetCode位运算(找出落单的数,二进制中1的个数,2的幂等)

    文章目录 位运算理论+技巧介绍 1.与 & 2.异或 ^ 3.移位及综合运用(指定位置) 4.同或 开撸 1. lc136 只出现一次的数字 2. lc137 只出现一次的数字II 3. lc ...

  5. 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= ...

  6. LeetCode 1275. 找出井字棋的获胜者(位运算)

    1. 题目 A 和 B 在一个 3 x 3 的网格上玩井字棋. 井字棋游戏的规则如下: 玩家轮流将棋子放在空方格 (" ") 上. 第一个玩家 A 总是用 "X" ...

  7. JAVA程序开发按位运算的记录

    忘记在哪里看到一个面试题:把int a,b的值互换,不能使用临时变量.刚开始完全懵逼,脑子里面全是浆糊,不知道如何下手.查看答案后猛地一惊,心想居然还有这种操作,真是叹为观止,真的感觉自己的基础是如此 ...

  8. 位运算+取某一位+java_Java位运算小节

    2019新春支付宝红包技术大揭秘在线峰会将于03-07日开始,点击这里报名届时即可参与大牛互动. 位运算表达式由操作数和位运算符组成,实现对整数类型的二进制数进行位运算.位运算符可以分为逻辑运算符(包 ...

  9. (转)C语言位运算详解

    地址:http://www.cnblogs.com/911/archive/2008/05/20/1203477.html C语言位运算详解 作者:911 说明:本文参考了http://www2.ts ...

最新文章

  1. BZOJ1453: [WC2005]Dface双面棋盘
  2. Pycharm安装pip pip安装第三方模块
  3. Java高并发编程(十一):Java中线程池
  4. 分库分表?如何做到永不迁移数据和避免热点?
  5. 【转】ABAP的坑1
  6. spring基于注解的声明式事务控制
  7. 【今日CV 计算机视觉论文速览 第137期】Fri, 28 Jun 2019
  8. 小米这个系列绝了!7款之后再添新机,完全分不清
  9. 电子档案管理系统java,电子政务档案管理系统 [Java/JSP] struts+hibernate+spring-DZZW - CodeBus...
  10. 那些软件可以测试网速,怎么测试网速 测试网速用什么软件
  11. Node.js的安装下载和运行JS代码和常用命令和按键
  12. 背包问题九讲笔记-01背包问题
  13. pytorch tensor索引、切片、连接——Indexing, Slicing, Joining
  14. 发现隐患里的自己,原来我是**人!
  15. 汤晓鸥教授:人工智能让天下没有难吹的牛!
  16. [转]XPO 条件相关类
  17. 进程之joinableQueue
  18. daimayuan每日一题#812 互质
  19. EU Long-term Dataset with Multiple Sensors for Autonomous Driving
  20. 5G移动通信标准学习笔记(一)

热门文章

  1. 马虎的算式 - 蓝桥杯
  2. 利用CSS定位背景图片
  3. 分布式数据库系统(DDBS) 概述
  4. 各类常见的网站检查工具
  5. c++ 判断nil_golang A=nil,B=A,but B!=nil 这是真的
  6. Vivado 中IP报严重警告Could not find module的解决办法
  7. 常用数学符号读法大全
  8. Verilog中memory数据类型
  9. javascript中的闭包这一篇就够了
  10. 第 1 章 虚拟化 - 013 - 动手实践 Linux VLAN