[poj1830]开关问题(高斯消元)

本文介绍了一种使用高斯消元法计算线性方程组中自由未知数数量的方法,并通过C++代码实现了该算法。具体而言,通过对增广矩阵进行初等行变换,将矩阵转化为阶梯形矩阵,进而确定自由元的数量。

题意:求高斯消元中自由元的个数,输出1<<ans;

 1 #include<cstdio>
 2 #include<cstdlib>
 3 #include<cstring>
 4 #include<cmath>
 5 #include<iostream>
 6 #include<algorithm>
 7 using namespace std;
 8 const int N=35;
 9 int a[N][N],ans[N];
10 int T,n,x,nn;
11 int gauss(int nn){
12     int i,j,k,l;
13     for(i=1,j=1;i<=nn&&j<=nn;j++){
14         for(k=i;k<=nn;k++)if(a[k][j])break;
15         if(a[k][j]){
16             for(l=1;l<=nn+1;l++)swap(a[i][l],a[k][l]);
17             for(l=1;l<=nn;l++){
18                 if(l!=i&&a[l][j])for(k=1;k<=nn+1;k++)a[l][k]^=a[i][k];
19             }
20             i++;
21         }
22     }
23     for(j=i;j<=nn;j++)if(a[j][n+1])return -1;
24     return 1<<(n-i+1); 
25 }
26 
27 int main(){
28     scanf("%d",&T);
29     while(T--){
30         memset(a,0,sizeof a);
31         scanf("%d",&n);
32         for(int i=1;i<=n;i++)scanf("%d",&a[i][n+1]);
33         for(int i=1;i<=n;i++)scanf("%d",&x),a[i][n+1]^=x;
34         int tx,ty;
35         while(scanf("%d%d",&tx,&ty)&&(tx||ty))a[ty][tx]=1;//注意 
36         for(int i=1;i<=n;i++)a[i][i]=1;
37         int ans=gauss(n);
38         if(ans==-1)printf("Oh,it's impossible~!!\n");
39         else printf("%d\n",ans); 
40     }
41     return 0;
42 }

 

转载于:https://www.cnblogs.com/elpsycongroo/p/7674831.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值