高斯消元通用
#include<stdio.h>
#include<algorithm>
#include<iostream>
#include<string.h>
#include<math.h>
using namespace std;const int MAXN=50;int a[MAXN][MAXN];
int x[MAXN];
bool free_x[MAXN];inline int gcd(int a,int b)
{int t;while(b!=0){t=b;b=a%b;a=t;}return a;
}
inline int lcm(int a,int b)
{return a/gcd(a,b)*b;
}
int Gauss(int equ,int var)
{int i,j,k;int max_r;int col;int ta,tb;int LCM;int temp;int free_x_num;int free_index;for(int i=0;i<=var;i++){x[i]=0;free_x[i]=true;}col=0; for(k = 0;k < equ && col < var;k++,col++){
max_r=k;for(i=k+1;i<equ;i++){if(abs(a[i][col])>abs(a[max_r][col])) max_r=i;}if(max_r!=k){for(j=k;j<var+1;j++) swap(a[k][j],a[max_r][j]);}if(a[k][col]==0){k--;continue;}for(i=k+1;i<equ;i++){if(a[i][col]!=0){LCM = lcm(abs(a[i][col]),abs(a[k][col]));ta = LCM/abs(a[i][col]);tb = LCM/abs(a[k][col]);if(a[i][col]*a[k][col]<0)tb=-tb;for(j=col;j<var+1;j++){a[i][j] = a[i][j]*ta-a[k][j]*tb;}}}}for (i = k; i < equ; i++){ if (a[i][col] != 0) return -1;}if (k < var){for (i = k - 1; i >= 0; i--){free_x_num = 0; for (j = 0; j < var; j++){if (a[i][j] != 0 && free_x[j]) free_x_num++, free_index = j;}if (free_x_num > 1) continue; temp = a[i][var];for (j = 0; j < var; j++){if (a[i][j] != 0 && j != free_index) temp -= a[i][j] * x[j];}x[free_index] = temp / a[i][free_index]; free_x[free_index] = 0; }return var - k; }for (i = var - 1; i >= 0; i--){temp = a[i][var];for (j = i + 1; j < var; j++){if (a[i][j] != 0) temp -= a[i][j] * x[j];}if (temp % a[i][i] != 0) return -2; x[i] = temp / a[i][i];}return 0;
}
int main(void)
{freopen("in.txt", "r", stdin);freopen("out.txt","w",stdout);int i, j;int equ,var;while (scanf("%d %d", &equ, &var) != EOF){memset(a, 0, sizeof(a));for (i = 0; i < equ; i++){for (j = 0; j < var + 1; j++){scanf("%d", &a[i][j]);}}
int free_num = Gauss(equ,var);if (free_num == -1) printf("无解!\n");else if (free_num == -2) printf("有浮点数解,无整数解!\n");else if (free_num > 0){printf("无穷多解! 自由变元个数为%d\n", free_num);for (i = 0; i < var; i++){if (free_x[i]) printf("x%d 是不确定的\n", i + 1);else printf("x%d: %d\n", i + 1, x[i]);}}else{for (i = 0; i < var; i++){printf("x%d: %d\n", i + 1, x[i]);}}printf("\n");}return 0;
}
高斯消元异或方程组
#include<bits/stdc++.h>
#define debug(a,b) printf("%s = %d\n",a,b);
using namespace std;
typedef long long ll;
typedef pair<int, int> PII;
clock_t startTime, endTime;
const ll INF_ll=1e18;
const int INF_int=0x3f3f3f3f;
inline ll read(){ll s=0,w=1ll;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')w=-1ll;ch=getchar();}while(ch>='0'&&ch<='9') s=s*10ll+((ch-'0')*1ll),ch=getchar();return s*w;
}
void rd_test(){#ifdef ONLINE_JUDGE#elsestartTime = clock(); freopen("in.txt","r",stdin);#endif
}
void Time_test(){#ifdef ONLINE_JUDGE#elseendTime = clock(); printf("\n运行时间为:%lfs\n",(double)(endTime - startTime) / CLOCKS_PER_SEC);#endif
}
int a[55][55],n,m,as=1<<26,tot,ans[55];;
void gauss()
{for(int i=1;i<=n;i++){int j=i;while(j<=n&&!a[j][i])j++;if(j>n)continue;if(i!=j)for(int k=1;k<=n+1;k++)swap(a[i][k],a[j][k]);for(int j=1;j<=n;j++)if(i!=j&&a[j][i])for(int k=1;k<=n+1;k++)a[j][k]^=a[i][k];}
}
void dfs(int now)
{if(tot>=as)return;if(!now){as=min(as,tot);return;}if(a[now][now]){int t=a[now][n+1];for(int i=now+1;i<=n;i++)if(a[now][i])t^=ans[i];ans[now]=t;if(t)tot++;dfs(now-1);if(t)tot--;}else{tot++;ans[now]=1;dfs(now-1);tot--;ans[now]=0;dfs(now-1);}
}
int main()
{scanf("%d%d",&n,&m);for(int i=1;i<=n;i++)a[i][i]=1,a[i][n+1]=1;for(int i=1;i<=m;i++){int x,y;scanf("%d%d",&x,&y);a[x][y]=a[y][x]=1;}gauss();for(int i=1;i<=n;i++){for(int j=1;j<=n+1;j++)printf("%d ",a[i][j]);printf("\n");}dfs(n);printf("%d\n",as);
}