首页 > 学院 > 开发设计 > 正文

BZOJ 1770 Nov lights 高斯消元

2019-11-08 19:46:30
字体:
来源:转载
供稿:网友

高斯消元解异或方程 暴搜自由元即可

#include <cstdio>#include <algorithm>#include <cstring>#include <cmath>#include <vector>#include <map>#include <set>#define MAXN 40#define ls ch[o][0]#define rs ch[o][1]#define key ch[ch[root][1]][0]#define max(a,b) ((a)>(b)?(a):(b))#define min(a,b) ((a)<(b)?(a):(b))using namespace std;const double eps=1e-8;const int INF=1e9;inline int read(){ int f=1,t=0;char ch=getchar(); while(ch>'9'||ch<'0'){if(ch=='-') f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){t=t*10+ch-'0',ch=getchar();} return t*f;}//inline void swap(int &a,int &b){int t=a;a=b;b=t;}int n,m,mins=INF;int a[MAXN][MAXN],ans[MAXN];void PRint(){ for(int i=1;i<=n;i++) { for(int j=1;j<=n+1;j++) printf("%d ",a[i][j]); printf("/n"); }}void init(){ n=read(),m=read(); for(int i=1;i<=m;i++) { int t1=read(),t2=read(); a[t1][t2]=a[t2][t1]=1; } for(int i=1;i<=n;i++) a[i][i]=a[i][n+1]=1;}void gaosi(){ int to;double t; for(int i=1;i<=n;i++) { for(to=i;to<=n;to++) if(a[to][i]) break; if(to>n) continue; if(to!=i) for(int j=1;j<=n+1;j++) swap(a[to][j],a[i][j]); for(int j=i+1;j<=n;j++) if(a[j][i])for(int k=1;k<=n+1;k++) a[j][k]^=a[i][k]; } //print();}void dfs(int x,int t){ if(t>=mins) return; if(!x){mins=min(mins,t);return;} if(a[x][x]) { int tmp=a[x][n+1]; for(int i=x+1;i<=n;i++) if(a[x][i]) tmp^=ans[i]; ans[x]=tmp; dfs(x-1,t+tmp); } else { ans[x]=0,dfs(x-1,t); ans[x]=1,dfs(x-1,t+1); }}int main(){ init(); gaosi(); dfs(n,0); printf("%d/n",mins); return 0;}
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表