高斯消元求线性方程组的解
高斯消元复杂度 O(N^
3)
参考 :整数线性方程组的解 | 自由变元的个数
http://www
.cnblogs.com/kuangbin/archive/
2012/
09/
01/
2667044.html
浮点线性方程组的解
http://www
.cnblogs.com/kuangbin/p/
3428573.html
异或方程组的解
http://blog
.csdn.net/u012936765/article/details/
46966517
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<vector>
#include<set>
#include<map>
using namespace std ;
const int maxn =
300 ;
int equ , var ;
int a[maxn][maxn] ;
int x[maxn] ;
int free_x[maxn] ;
int free_num ;
void dis(){
for(
int i =
0 ;i<
10 ;i++){
for(
int j =
0 ;j<
10 ;j++)
cout<<a[i][j]<<
" ";
cout<<endl;
}
cout<<
"asdfasd"<<endl;
for(
int i =
0 ;i<
10 ;i++)
cout<<x[i]<<
" ";
cout<<endl;
}
int Gauss(){
int max_r , col , k ;
free_num =
0 ;
for( k =
0 , col =
0 ; k < equ && col < var ; k ++ , col ++){
max_r = k ;
for(
int i = k +
1 ; i<equ ;i++){
if(
abs( a[i][col] >
abs( a[max_r][col] )))
max_r = i ;
}
if( a[max_r][col] ==
0 ){
k -- ;
free_x[ free_num ++ ] = col ;
continue ;
}
if( max_r != k ){
for(
int j = col ; j<var +
1 ; j++){
swap( a[k][j] , a[max_r][j]) ;
}
}
for(
int i = k +
1 ; i<equ ;i++){
if( a[i][col] !=
0 ){
for(
int j = col ; j< var +
1 ; j++)
a[i][j] ^= a[k][j] ;
}
}
}
for(
int i = k ;i<equ ;i++)
if( a[i][col] !=
0 )
return -
1 ;
if( k < var)
return var - k ;
for(
int i = var -
1 ; i>=
0 ;i--){
x[i] = a[i][var] ;
for(
int j = i +
1 ; j<var ; j++)
x[i] ^= ( a[i][j] && x[j] ) ;
}
dis() ;
return 0 ;
}
int n ;
void init(){
memset( a,
0 ,
sizeof( a )) ;
memset( x ,
0 ,
sizeof( x )) ;
equ = n* n ;
var = n* n ;
for(
int i =
0 ; i < n ; i++)
for(
int j =
0 ; j< n ;j++){
int t = i * n + j ;
a[t][t] =
1 ;
if( i>
0 ) a[ ( i -
1 ) * n + j ][t] =
1 ;
if( i<n-
1 )
a[ ( i+
1) * n + j ][t] =
1;
if( j >
0 )
a[i*n + j -
1][t] =
1 ;
if( j < n -
1)
a[i* n + j +
1][t] =
1 ;
}
}
void solve(){
int t = Gauss() ;
cout<<t<<endl;
if( t== -
1 ){
printf(
"inf\n") ;
return ;
}
else if( t==
0 ){
int ans =
0 ;
for(
int i =
0 ; i<n* n ;i++){
ans += x[i] ;
}
printf(
"%d\n" , ans ) ;
return ;
}
else{
int ans =
0x3f3f3f3f ;
int tot = (
1<< t ) ;
for(
int i =
0 ; i< tot ; i++){
int cnt =
0 ;
for(
int j =
0 ; j<t ; j++){
if( i & (
1<< j )){
x[free_x[j]] =
1 ;
cnt ++ ;
}
else
x[free_x[j]] =
0 ;
}
for(
int j = var - t -
1 ; j >=
0 ; j--){
int idx ;
for( idx = j ; idx < var ; idx ++)
if( a[j][idx])
break ;
x[idx] = a[j][var] ;
for(
int l = idx +
1 ; l < var ; l++)
if( a[j][l] )
x[idx] ^= x[l] ;
cnt += x[idx] ;
}
ans = min( ans , cnt ) ;
}
printf(
"%d\n" , ans ) ;
}
}
char str[
30][
30] ;
int main(){
int T ;
scanf(
"%d" , &T) ;
while( T-- ){
scanf(
"%d" , & n ) ;
init() ;
for(
int i =
0 ; i< n ;i++){
scanf(
"%s" , str[i]) ;
for(
int j =
0 ; j< n ;j ++){
if( str[i][j] ==
'y')
a[i* n + j ][n* n ] =
0 ;
else
a[i*n+j][n*n ] =
1 ;
}
}
solve() ;
}
return 0 ;
}
#include<stdio.h>
#include<algorithm>
#include<iostream>
#include<string.h>
#include<math.h>
using namespace std;
const int MAXN=
400;
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)%
7+
7)%
7;
}
}
}
}
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]%
7;
temp=(temp%
7+
7)%
7;
}
x[free_index] = (temp / a[i][free_index])%
7;
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];
temp=(temp%
7+
7)%
7;
}
while (temp % a[i][i] !=
0) temp+=
7;
x[i] =( temp / a[i][i])%
7 ;
}
return 0;
}
int tran(
char *s)
{
if(
strcmp(s,
"MON")==
0)
return 1;
else if(
strcmp(s,
"TUE")==
0)
return 2;
else if(
strcmp(s,
"WED")==
0)
return 3;
else if(
strcmp(s,
"THU")==
0)
return 4;
else if(
strcmp(s,
"FRI")==
0)
return 5;
else if(
strcmp(s,
"SAT")==
0)
return 6;
else return 7;
}
char str1[
20];
char str2[
20];
int main()
{
int n,m;
int k;
int t;
while(
scanf(
"%d%d",&n,&m)!=EOF)
{
if(n==
0&&m==
0)
break;
memset(a,
0,
sizeof(a));
for(
int i=
0;i<m;i++)
{
scanf(
"%d%s%s",&k,&str1,&str2);
a[i][n]=((tran(str2)-tran(str1)+
1)%
7+
7)%
7;
while(k--)
{
scanf(
"%d",&t);
t--;
a[i][t]++;
a[i][t]%=
7;
}
}
int ans=Gauss(m,n);
if(ans==
0)
{
for(
int i=
0;i<n;i++)
if(x[i]<=
2)x[i]+=
7;
for(
int i=
0;i<n-
1;i++)
printf(
"%d ",x[i]);
printf(
"%d\n",x[n-
1]);
}
else if(ans==-
1)
printf(
"Inconsistent data.\n");
else printf(
"Multiple solutions.\n");
}
return 0;
}