高斯消元求解异或方程组:

比较不错的一篇文章:http://blog.sina.com.cn/s/blog_51cea4040100g7hl.html

cojs.tk  539. 牛棚的灯

★★☆   输入文件:lights.in   输出文件:lights.out   简单对比

时间限制:1 s   内存限制:128 MB

【问题描述】

贝希和她的闺密们在她们的牛棚中玩游戏。但是天不从人愿,突然,牛棚的电源跳闸了,所有的灯都被关闭了。贝希是一个很胆小的女生,在伸手不见拇指的无尽的黑暗中,她感到惊恐,痛苦与绝望。她希望您能够帮帮她,把所有的灯都给重新开起来!她才能继续快乐地跟她的闺密们继续玩游戏!

牛棚中一共有N(1 <= N <= 35)盏灯,编号为1到N。这些灯被置于一个非常复杂的网络之中。有M(1 <= M <= 595)条很神奇的无向边,每条边连接两盏灯。

每盏灯上面都带有一个开关。当按下某一盏灯的开关的时候,这盏灯本身,还有所有有边连向这盏灯的灯的状态都会被改变。状态改变指的是:当一盏灯是开着的时候,这盏灯被关掉;当一盏灯是关着的时候,这盏灯被打开。

问最少要按下多少个开关,才能把所有的灯都给重新打开。

数据保证至少有一种按开关的方案,使得所有的灯都被重新打开。

题目名称:lights

输入格式:

*第一行:两个空格隔开的整数:N和M。

*第二到第M+1行:每一行有两个由空格隔开的整数,表示两盏灯被一条无向边连接在一起。

没有一条边会出现两次。

样例输入(文件 lights.in):

5 6

1 2

1 3

4 2

3 4

2 5

5 3

输入细节:

一共有五盏灯。灯1、灯4和灯5都连接着灯2和灯3。

输出格式:

第一行:一个单独的整数,表示要把所有的灯都打开时,最少需要按下的开关的数目。

样例输出(文件 lights.out):

3

输出细节:

按下在灯1、灯4和灯5上面的开关。

hwzer的代码:

1 #include

2 #include

3 #include

4 #include

5 #include

6 #include

7 #define inf 1000000000

8 #define ll long long

9 using namespacestd;10 inline intread()11 {12 int x=0,f=1;char ch=getchar();13 while(ch'9'){if(ch=='-')f=-1;ch=getchar();}14 while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}15 return x*f;16 }17 intn,m,tot;18 int mn=inf;19 int f[45][45],ans[45];20 voidgauss()21 {/*一共有n个方程,n个变量*/

22 for(int i=1;i<=n;i++)23 {24 int j=i;/*第i行第i列是要向下消元的,如果该行是0,就找一个不是0的一行和他互换后,向下消元,如果j>n,说明所有行的第i列都是0,那就不用消元了*/

25 while(j<=n&&!f[j][i])j++;26 if(j>n)continue;27 if(i!=j)for(int k=1;k<=n+1;k++)swap(f[i][k],f[j][k]);/*互换*/

28 for(int j=i+1;j<=n;j++)/*用第i行向下消元*/

29 if(i!=j&&f[j][i])/*消元时,只消这一项不是0的方程即可*/

30 for(int k=1;k<=n+1;k++)/*消这个方程的时候要把所有的量的都对应相消*/

31 f[j][k]^=f[i][k];32 }33 }34 /*,因为,上面只是求出一组解,并不是最小解。35 所以,我们需要求出所有解,然后输出最小的那个。36 在求倒三角后,有一些m[i][i]==0,这时,我们对x[i]的取值就有两种,0或1。37 本身,x[i]的取值对第i行的方程没有任何影响,但它的取值对其他方程有影响,38 所以,这里需要枚举x[i]的取值。*/

39 void dfs(intnow)40 {/*tot表示按下灯的数目*/

41 if(tot>=mn)return;/*剪枝,取小操作,一旦大了就不用求了*/

42 if(!now)/*搜索的终点*/

43 {44 mn=min(mn,tot);45 return;46 }47 if(f[now][now])/*如果now不是自由变元*/

48 {/*这就是求出当前解ans[now]的过程,利用了性质t=a^b,那么t^b等于a,最后的 f[now][n+1],是由前面的ans[i](f[now][i]不等于0)异或得出的,可以异或回去,求出ans[now]*/

49 int t=f[now][n+1];50 for(int i=now+1;i<=n;i++)51 if(f[now][i])t^=ans[i];52 ans[now]=t;53 if(t)tot++;/*如果当前的灯要按下,统计总数*/

54 dfs(now-1);/*搜索上一盏灯*/

55 if(t)tot--;/*回溯的过程,为什么可以回溯呢,因为异或方程组会有多组解,即使当前的now灯不按下,求后面的now-1仍然可以有解,说不定还可以更优,所以要回溯*/

56 }57 else /*如果now是自由变元,自由变元取到任何值,最终方程都会有解,就枚举x[now]是0还是1,进行搜索*/

58 {59 ans[now]=0;dfs(now-1);60 ans[now]=1;tot++;dfs(now-1);tot--;/*别忘记搜索中的回溯*/

61 }62 }63 intmain()64 {/*f[i][j]表示i--j有边相连,所以是1,其余的是0,在方程组中,*0后结果就没有影响了*/

65 freopen("lights.in","r",stdin);66 freopen("lights.out","w",stdout);67 n=read();m=read();68 for(int i=1;i<=n;i++)69 f[i][i]=1,f[i][n+1]=1;70 for(int i=1;i<=m;i++)71 {72 int x=read(),y=read();73 f[x][y]=f[y][x]=1;74 }75 gauss();dfs(n);/*从n开始搜索,是因为n的变元数目少*/

76 printf("%d",mn);77 fclose(stdin);fclose(stdout);78 return 0;79 }

我的代码:

1 #define N 40

2 #include

3 using namespacestd;4 #include

5 #include

6 intans[N],f[N][N],x,y,n,m;7 int minn=(1<<31)-1,tot=0;8 intread()9 {10 int sum=0,ff=1;chars;11 s=getchar();12 while(s'9')13 {14 if(s=='-') ff=-1;15 s=getchar();16 }17 while('0'<=s&&s<='9')18 {19 sum=sum*10+s-'0';20 s=getchar();21 }22 return sum*ff;23 }24 voidgauss()25 {26 for(int i=1;i<=n;++i)27 {28 int j=i;29 while(j<=n&&!f[j][i]) j++;30 if(j>n) continue;31 if(i!=j)32 {33 for(int k=1;k<=n+1;++k)34 {35 swap(f[i][k],f[j][k]);36 }37 }38 for(int j=i+1;j<=n;++j)39 if(f[j][i])40 {41 for(int k=1;k<=n+1;++k)42 f[j][k]^=f[i][k];43 }44 }45 }46 void dfs(intnow)47 {48 if(tot>=minn) return;49 if(!now)50 {51 minn=min(minn,tot);52 return;53 }54 if(f[now][now])55 {56 int t=f[now][n+1];57 for(int i=now+1;i<=n;++i)58 if(f[now][i]) t^=ans[i];59 ans[now]=t;60 if(t) tot++;61 dfs(now-1);62 if(t) tot--;63 }64 else

65 {66 ans[now]=1;tot++;dfs(now-1);67 ans[now]=0;tot--;dfs(now-1);68 }69 }70 intmain()71 {72 //freopen("lights.in","r",stdin);73 //freopen("lights.out","w",stdout);

74 n=read();m=read();75 for(int i=1;i<=n;++i)76 f[i][i]=f[i][n+1]=1;77 for(int i=1;i<=m;++i)78 {79 x=read();80 y=read();81 f[x][y]=f[y][x]=1;82 }83 gauss();84 dfs(n);85 printf("%d",minn);86 //fclose(stdin);87 //fclose(stdout);

88 return 0;89 }

如何用matlab解异或方程,高斯消元法求解异或方程组: cojs.tk 539.//BZOJ 1770 牛棚的灯...相关推荐

  1. 如何用matlab解异或方程,Matlab-6:解非线性方程组newton迭代法

    函数文件: function x=newton_Iterative_method(f,n,Initial) x0=Initial; tol=1e-11; x1=x0-Jacobian(f,n,x0)\ ...

  2. matlab抛物偏微分方程,抛物型方程差分求解 跪求MATLAB解抛物型偏微分方程的程序...

    为什么抛物线方程与圆方程联立不能使用韦达定理 很容易了解到,抛物线和圆的交点均在X轴上方\"其实这时你应该注意到一点就是,这两个交点的纵坐标是相等的,所以其实对应的是一个y值,也就是你列的一 ...

  3. matlab解含字母方程,求助关于解含字母参数方程组的问题

    我现在需要解一个含字母的方程组,写的代码为 [x,y]=solve('lac*cos(a0-a1)+lab*cos(a2)-lcd-lbd*cos(a3)','lac*sin(a0-a1)+lab*s ...

  4. matlab解含参方程,matlab解含参隐函数方程

    先拟合出: x2   =              0.000124354608284474 x1     =            71.0611809557734 相关系数(R): 0.99453 ...

  5. matlab解二阶微分方程组ode,MATLAB解含参数方程、矩阵方程、二阶微分方程组

    1.如下公式: 其中x.y.m.n为参数,a.b为未知数,利用MATLAB求解方程: syms x y m n a b; [a,b]=solve('x=m*cos(a)+n*cos(a+b)','y= ...

  6. matlab 二次不等式约束,请教高手如何用matlab解多元二次不等式的解,有三个未知数x1,x2,x3,约束条件如下:...

    共回答了15个问题采纳率:86.7% 楼上正解无错 再给一种不同的形式 function zd0323 format long%改变格式,使更精确输出结果 %% 目标函数 function y=fun ...

  7. matlab解rlc电路方程,RLC电路matlab仿真.pdf

    RLC电路matlab仿真 RLC 1) MATLAB 2) MATLAB 3) M MATLAB 4) E 1V R 10 L 0.01H C 1F (i0) 0A u(0) 0V u (t) ...

  8. 如何用java解一元二次方程方程

    下面是一个解一元二次方程的 Java 程序: import java.util.Scanner;public class Main {public static void main(String[] ...

  9. matlab解五元方程,哪位大侠帮忙解这个五元四次方程组

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 L1 =(((4*Delta01*L1*sin(Ai)^2 + 8*Delta01*L3*sin(Ai)^2 + 4*Delta01*L4*sin(Ai) ...

最新文章

  1. html简单响应式滚动条置顶
  2. 【讨论贴】关于父实子虚的疑问???
  3. 动态链接库dll的两种加载方式
  4. CoNEXT 2018:在Facebook上部署IETF QUIC
  5. 第二章 UML与设计模式
  6. 孟小峰:大数据管理与数据思维
  7. 网络游戏外挂编写基础
  8. virtual box和vmware有什么区别吗_真发假发套与普通假发有什么区别吗?
  9. linux ubi代码分析,linux ubi文件系统
  10. 代码版本管理软件Git的优势和用法
  11. Origin在保存多因子箱线图模板时,怎样在下次应用时,直接使用RAW数据?
  12. echart柱状图堆列实现百分比显示
  13. 编程中常用的英文单词
  14. 上传文件到GPU服务器,上传文件到GPU服务器并运行文件
  15. 计算机组成与设计chapter3,Chapter 1 计算机概要与技术
  16. 现代办公的新选择,讯飞智能录音笔SR302 Pro
  17. 《绝地求生》玩家排名预--2.问题分析
  18. 浚县天气预报软件测试,浚县天气预报15天
  19. OpenCV计算机视觉编程攻略第2版pdf
  20. Incremental-Network-Quantization增量网络量化论文详解

热门文章

  1. 【第三周:Excel】7周成为数据分析师
  2. OptaPlanner实用技术 - 批量规划和实时规划(2)
  3. 展锐平台userdebug版本关闭ylog
  4. js数组中常见的方法
  5. 陌上人如玉,君子世无双——卡卡
  6. 阿里云 磁盘在线扩容120g扩容到200g
  7. 在html中使用Echarts制作中国地图
  8. mac开关隐藏文件方法
  9. 520到了,用Python给女朋友比心表白
  10. IE11使用 ActiveX 控件