CF1070L Odd Federalization 高斯消元
\(r = 1\)直接判断所有点度数是否为偶数
考虑\(r = 2\)的情况。设\(x_i=0/1\)表示\(i\)点所在的集合,那么若\(2 \mid du_u\),则\(\bigoplus\limits_{(u,v) \in e} x_v = 0\),否则\(\bigoplus\limits_{(u,v) \in e} x_v = x_u \bigoplus 1\),即\(x_u\ \ xor\ \ \bigoplus\limits_{(u,v) \in e} x_v = 1\)。
可以发现上面是一个异或方程组,高斯消元解出来即可。
但是\(r\)有可能\(> 2\)吗?事实上\(r\)只会等于\(1\)或者\(2\)。
可以发现如果\(r>2\),意味着上面的异或方程组无解。无解则存在某些异或方程能够异或得到\(0=1\)。右式为\(1\)意味着有奇数个入度为奇数的点,而左式为\(0\)意味着所有点在这些异或方程中都出现了偶数次,而度数为奇数的点会在自己的方程中出现一次,所以在这个导出子图中,度数为奇数的点连接了奇数个点,度数为偶数的点连接了偶数个点,这意味着这个导出子图的度数和为奇数。但对于一个无向图度数无论如何都是偶数,所以不存在无解情况,所以\(r \leq 2\)。
#include<bits/stdc++.h>
using namespace std;
inline int read(){
int a = 0;
char c = getchar();
bool f = 0;
while(!isdigit(c)){
if(c == '-')
f = 1;
c = getchar();
}
while(isdigit(c)){
a = (a << 3) + (a << 1) + (c ^ '0');
c = getchar();
}
return f ? -a : a;
}
const int MAXN = 2010;
bitset < MAXN > gauss[MAXN];
int N , M , ans[MAXN];
int main(){
for(int T = read() ; T ; --T){
N = read();
M = read();
for(int i = 1 ; i <= N ; ++i){
gauss[i].reset();
gauss[i].set(i);
}
for(int i = 1 ; i <= M ; ++i){
int a = read() , b = read();
gauss[a][N + 1] = ~gauss[a][N + 1];
gauss[b][N + 1] = ~gauss[b][N + 1];
gauss[a][b] = gauss[b][a] = 1;
}
bool f = 1;
for(int i = 1 ; f && i <= N ; ++i)
f = !gauss[i][N + 1];
if(f){
puts("1");
for(int i = 1 ; i <= N ; ++i)
printf("1 ");
}
else{
for(int i = 1 ; i <= N ; ++i)
if(!gauss[i][N + 1])
gauss[i][i] = 0;
int now = 1;
for(int i = 1 ; i <= N ; ++i){
int j = now;
while(j <= N && !gauss[j][i])
++j;
if(j > N){
ans[i] = 0;
for(int k = 1 ; k < now ; ++k)
gauss[k][i] = 0;
continue;
}
if(j != now)
swap(gauss[j] , gauss[now]);
while(++j <= N)
if(gauss[j][i])
gauss[j] ^= gauss[now];
++now;
}
for(int j = now - 1 ; j ; --j){
int p = 0;
for(int k = 1 ; !p && k <= N ; ++k)
if(gauss[j][k])
p = k;
ans[p] = gauss[j][N + 1];
for(int k = j - 1 ; k ; --k)
if(gauss[k][p])
gauss[k] ^= gauss[j];
}
puts("2");
for(int i = 1 ; i <= N ; ++i)
printf("%d " , ans[i] + 1);
}
putchar('\n');
}
return 0;
}
CF1070L Odd Federalization 高斯消元的更多相关文章
- 【BZOJ-3143】游走 高斯消元 + 概率期望
3143: [Hnoi2013]游走 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 2264 Solved: 987[Submit][Status] ...
- 【BZOJ-3270】博物馆 高斯消元 + 概率期望
3270: 博物馆 Time Limit: 30 Sec Memory Limit: 128 MBSubmit: 292 Solved: 158[Submit][Status][Discuss] ...
- *POJ 1222 高斯消元
EXTENDED LIGHTS OUT Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 9612 Accepted: 62 ...
- [bzoj1013][JSOI2008][球形空间产生器sphere] (高斯消元)
Description 有一个球形空间产生器能够在n维空间中产生一个坚硬的球体.现在,你被困在了这个n维球体中,你只知道球 面上n+1个点的坐标,你需要以最快的速度确定这个n维球体的球心坐标,以便于摧 ...
- hihoCoder 1196 高斯消元·二
Description 一个黑白网格,点一次会改变这个以及与其连通的其他方格的颜色,求最少点击次数使得所有全部变成黑色. Sol 高斯消元解异或方程组. 先建立一个方程组. \(x_i\) 表示这个点 ...
- BZOJ 2844 albus就是要第一个出场 ——高斯消元 线性基
[题目分析] 高斯消元求线性基. 题目本身不难,但是两种维护线性基的方法引起了我的思考. void gauss(){ k=n; F(i,1,n){ F(j,i+1,n) if (a[j]>a[i ...
- SPOJ HIGH Highways ——Matrix-Tree定理 高斯消元
[题目分析] Matrix-Tree定理+高斯消元 求矩阵行列式的值,就可以得到生成树的个数. 至于证明,可以去看Vflea King(炸树狂魔)的博客 [代码] #include <cmath ...
- UVALive 7138 The Matrix Revolutions(Matrix-Tree + 高斯消元)(2014 Asia Shanghai Regional Contest)
题目链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&category=6 ...
- [高斯消元] POJ 2345 Central heating
Central heating Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 614 Accepted: 286 Des ...
随机推荐
- Linux常用系统命令
致歉:各位看到此博客的朋友们 因为命令的数量挺多的很多命令也都很简单 我就总结了一下具体的命令和这个命令是做什么的,主要的使用方法是链接到http://man.linuxde.net/的网站的,请各 ...
- Android Stuido代码混淆
一.Android Studio 代码混淆基本配置首先我们要在build.gradle里设置 miifyEnabled 里改为true,表示可以混淆 proguardFiles getDefaultP ...
- (网页)angularjs中的interval定时执行功能(转)
转载博客园魔豆: 一个例子,用来显示当前实时时间,1秒钟刷新一次: <!DOCTYPE html> <html ng-app="myApp"> <he ...
- Centos7下搭建SVN服务,本地提交代码自动同步到WEB目录
1.安装SVN服务[root@bogon ~]# yum -y install subversion 2.查看svnserve安装目录[root@bogon ~]# whereis svnserves ...
- 心迹 使用说明&功能展示
下载地址 心迹.apk 更新于2018.8.9 11:47 测试账号:用户名testing,密码testing 项目地址 GitHub 注册&登录 第一次使用心迹app时,必须进行注册,以便区 ...
- sql2008和sql2012混合安装后打开SQL Server 配置管理器查看出现“远程过程调用失败”0x800706be
sql2008和sql2012混合安装后打开SQL Server 配置管理器SQL Server服务出现“远程过程调用失败”0x800706be 网上很多人都说这个解决方案,通过卸载“Microsof ...
- 【PAT】B1037 在霍格沃茨找零钱(20 分)
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; int ...
- 【PAT】B1082 射击比赛(20 分)
水提水题,直接贴代码啦 #include<cstdio> #include<algorithm> using namespace std; struct ppp{ int id ...
- zabbix实现微信告警配置
zabbix设置微信报警的配置过程 zabbix的报警方式有很多,在这里我们来详细说明一下如何通过微信报警 微信企业号的申请 注册的地址https://qy.weixin.qq.com/ 这样企业就 ...
- rls与rlsd
服务器端的程序一般有如下几个过程,首先是bind,然后再是listen,最后是accept.再往后就是客户端与服务器连接后的各种操作了. 相比之下,客户端的程序就比较简单了,只需先获得sock_id, ...