【HDU 5765】Bonds(进制运算妙用)

Bonds

Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 309    Accepted Submission(s): 140

Problem Description
Given an undirected connected graph with NN points and MM edges. ???? wants to know the number of occurrence in all bonds of graph for every edge.The index of points starts from 00.
An edge cut EE of a Graph GG is a set of edges of GG and the GG would be disconnected after deleting all the edges of EE.
A bond of a graph is an edge cut does not have any other edge cut as a proper subset.

Input
The first line of the input gives the number of test cases TT; TT test cases follow.
Each test case consists of two integers: NN, MM, followed by MM lines, each line contains two integers uu, vv, implying an undirected edge between uu and vv.

limits
T<=20T
2<=N<=202
N−1<=M<=N∗(N−1)/2N-1
Edges are distinct.
No edge connects to the point itself.
NN is larger than 1010 in no more than 55 cases.

Output
For each test case output “Case #x: y1 y2 … yN” (without quotes), where x is the test case number (starting from 1), and yi is the occurrence times in all bonds of i-th edge.

Sample Input
2
3 3
0 1
0 2
1 2
3 2
0 1
0 2

Sample Output
Case #1: 2 2 2
Case #2: 1 1

Hint
In first case, {(0,1),(0,2)} , {(0,1),(1,2)} , {(0,2),(1,2)} are bonds.
In second case, {(0,1)},{(0,2)} is bond.

Author
FZU

Source
2016 Multi-University Training Contest 4

题意:
给出一个nn个点的无向连通图GG
由mm条边连通,给出mm条边u  vu \ \ v

已知极小割边集恰好会将原图分成两块。
询问对于边0 m−10~m-1,每条边所在的极小割边集的个数

这题用位运算简直不能再精美(从QAQ巨那里学来的

首先题目要找对于每条边u−vu-v所在的最小割边集的个数。
如果能找出G图中所有的连通图的个数,然后减去包含u−vu-v边的连通图的个数,就是要找的答案。

接下来只要找出连通图的个数和包含u、v的连通图个数就可以了。
同时避免重复统计。
其他的都在代码(注释)里了~~~

#include <iostream>
#include <cmath>
#include <vector>
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <queue>
#include <stack>
#include <list>
#include <algorithm>
#include <map>
#include <set>
#define LL long long
#define Pr pair<int,int>
#define fread(ch) freopen(ch,"r",stdin)
#define fwrite(ch) freopen(ch,"w",stdout)using namespace std;
const int INF = 0x3f3f3f3f;
const int msz = 1<<20;
const int mod = 1e9+7;
const double eps = 1e-8;//Lowbit运算是个好东西,x拆成二进制后,返回低位第一个1所在的进制
//10010->10
//11000->1000
int lb(int x)
{return x&(-x);
}int cnt[msz];
int eg[msz];//搜索点集S(二进制表示)是否为连通图
bool cal(int S)
{//BFS的转换,now表示当前搜索的集合int now = lb(S);//vis跟vis数组一个意思,表示已经访问过的点集int vis = 0;int u;//当now == vis时,表示已经没有多余的可访问的点了//此时now表示的就是集合S中lb(S)所在的联通点集while(now != vis){//找到当前集合最低位的第一个未被访问的点u = lb(now^vis);//标记为访问过vis |= u;//将与该点直接相连且在S中的点加入当前集合//eg数组在main中输入边的时候统计了now |= eg[u]&S;}//如果S中每个点都被访问过了 那么S就是连通的return vis == S;
}int u[233],v[233];
int main()
{//fread("");//fwrite("");int t;scanf("%d",&t);int n,m;for(int z = 1; z <= t; ++z){scanf("%d%d",&n,&m);int tot = (1<<n)-1;memset(eg,0,sizeof(eg));memset(cnt,0,sizeof(cnt));for(int i = 0; i < m; ++i){scanf("%d%d",&u[i],&v[i]);u[i] = 1<<u[i];v[i] = 1<<v[i];//eg[u]存放与u相连的点。u直接变为二进制,方便eg[u[i]] |= v[i];eg[v[i]] |= u[i];}int ans = 0;for(int i = 0; i < tot; ++i){//i&1是避免重复统计。if((i&1) && cal(i) && cal(tot^i)){ans++;cnt[i]++;cnt[tot^i]++;}}//cnt此时表示集合是否连通//经过下面的操作 cnt[S]表示S集合所在的连通集的个数//i枚举点for(int i = 1; i <= tot; i <<= 1)for(int j = 0; j <= tot; ++j)if(j&i){//将集合S所在的连通图个数赋予S^i(S中除去i点后的集合)cnt[j^i] += cnt[j];}printf("Case #%d:",z);for(int i = 0; i < m; ++i){printf(" %d",ans-cnt[u[i]|v[i]]);}puts("");}return 0;
}

【HDU 5765】Bonds(进制运算妙用)相关推荐

  1. 计算机编码二进制0001,二进制学习01(二进制,进制运算,数据宽度,无符号位有符号位编码规则)...

    二进制学习01 进制 一.二进制简介 1)什么是二进制? 2)二进制的简写形式 二.进制运算 1)八进制运算表 (1) 加法运算表 (2)乘法运算表 (3)八进制简单运算题 三.数据宽度 1)什么是数 ...

  2. MATLAB 如何做16进制运算

    MATLAB 如何做16进制运算 请参考: https://blog.csdn.net/kabuto_hui/article/details/49853687

  3. python进制运算

    ''' 进制运算 '''#10进制转2进制 i = 16 j = bin(i) print(j)#10进制转8进制 j = oct(i) print(j)#10进制转16进制 j = hex(i) p ...

  4. 计算机底层入门 02 进制运算二进制和十六进制

    1.4 进制运算 八进制计算下面的结果 2 + 3 = 5 2 * 3 = 6 4 + 5 = 11 4 * 5 = 24 运算的本质就是查数 0 1 2 3 4 5 6 7 用十进制来辅助运算,然后 ...

  5. 逆向分析一进制运算笔记

    参考文档: 什么是算术运算?什么是关系运算?什么是逻辑运算?_月已满西楼的博客-CSDN博客_什么是算术运算 基本逻辑运算_qq_35912930的博客-CSDN博客_基本逻辑运算 (2条消息) 计算 ...

  6. 1213: 检查金币 进制的妙用

    文章目录 问题 详细分析 代码注释 大开眼界 问题 1213: 检查金币 时间限制: 1 Sec 内存限制: 128 MB 提交: 536 解决: 323 ACM公司生产金币的设备出了问题,使得最近生 ...

  7. java 60进制运算_Java【第二篇】基本语法之--进制、运算符

    进制 生活中的进制:七进制(一周).十二进制(12小时制).二十四进制(24小时制).六十进制(分钟) 对于整数,有四种表示方式: 二进制(binary):0,1 ,满 2 进 1.以 0b 或 0B ...

  8. 【进制运算】计算机的小任性——我说0代表正数,1代表负数,就是对的!

    话说我平时无聊就会想一些奇奇怪怪的问题,今天又突然想到了一个奇怪的问题--为啥计算机里"0"代表的是正数,"1"代表的是负数? 为此,我专门百度了下这个问题的答 ...

  9. 所有的计算机语言都必须进行多进制运算,2018职称计算机考试巩固练习及答案17...

    2018职称计算机考试巩固练习及答案17 1. 计算机内采用二进制的主要原因是 A.运算速度快 B.运算精度高 C.算法简单 D. 电子元件的特征 2. 计算机中的所有信息在计算机内部都是以 表示的 ...

最新文章

  1. 推荐的 PHP 读物列表
  2. 谷歌新 AI 实验室主管 Hugo 深度学习教程:神经网络、CV、NLP 难点解析
  3. 引用参考文献不显示_如何简单几步来一键修改参考文献格式
  4. csrf-token
  5. 探索Julia(part10)--自定义函数
  6. shell编程中date用法(转)
  7. jQuery-DOM操作
  8. jsp 静态资源 打入jar
  9. BZOJ 1004: [HNOI2008]Cards [Polya 生成函数DP]
  10. listary的使用教程
  11. 穷举法 解决用3个水桶等分8升水 python实现
  12. mysql分组聚合compute_SQLServer之Compute/ComputeBy实现数据汇总
  13. ToC和ToB有啥区别
  14. RabbitMQ问题解决:TCP connection succeeded but Erlang distribution failed
  15. Java调用IE浏览器
  16. excel中利用综合应用len(),lenb(),left() ,find()函数筛选汉字问题
  17. 夺冠!小米在 IWSLT 2022国际机器同传比赛中获佳绩
  18. execl批量创建文件夹乱码解决方案
  19. 仿抖音右滑清屏,左滑列表功能
  20. 【Flutter 问题系列第 22 篇】在 Flutter 中如何截取屏幕并显示到页面中,以及如何将截图保存到相册

热门文章

  1. 常用服务器查询日志命令(持续添加)
  2. 华为p4支持鸿蒙功能吗_华为鸿蒙2.0系统支持的手机型号 华为鸿蒙2.0系统详解[多图]...
  3. 百度网盘PC端登录安全验证显示空白页
  4. 苹果手机打电话没有声音怎么回事_微信打电话没有声音
  5. 2000国家大地坐标系
  6. 控制测量步骤及其内业计算
  7. 怎么计算机械连接的工程量,传力杆套筒工程量怎么算
  8. Oracle查询某一天数据的SQL语句的几种写法
  9. 手把手教你画圆锥渐变
  10. Accept CS Ph.D. Offer from Stony Brook University,去SUNY石溪大学的CS Ph.D.啦