高斯消元
高斯消元模板——cogs 721
/*高斯消元求解线性方程组*/ #include<cstdio> #include<algorithm> #include<iostream> #include<cmath> using namespace std; #define N 100 #define eps (1e-8) int n;double a[N][N]; int main(){ freopen("gaess.in", "r", stdin); freopen("gaess.out", "w", stdout); //freopen("cola.txt","r",stdin); scanf("%d",&n); for(int i=1;i<=n;i++)for(int j=1;j<=n+1;j++)scanf("%lf",&a[i][j]); for(int i=1;i<=n;i++){ int p=i; for(int j=i+1;j<=n;j++)if(fabs(a[j][i])>fabs(a[p][i]))p=j; for(int j=1;j<=n+1;j++)swap(a[p][j],a[i][j]); if(fabs(a[i][i])<eps)continue; double tmp=a[i][i]; for(int j=1;j<=n+1;j++)a[i][j]/=tmp; for(int j=1;j<=n;j++) if(i!=j){ double tmp=a[j][i]; for(int k=1;k<=n+1;k++)a[j][k]-=a[i][k]*tmp; } } int imp=0,ult=0; for(int i=1;i<=n;i++){ int j=1; while(fabs(a[i][j])<eps&&j<=n+1)j++; if(j>n+1)ult=1; else if(j==n+1)imp=1; } if(imp){printf("-1");return 0;} if(ult){printf("0");return 0;} for(int i=1;i<=n;i++){ if(fabs(a[i][n+1])<eps)printf("x%d=0\n",i); else printf("x%d=%.2lf\n",i,a[i][n+1]); } }
bzoj1013
#include<iostream> #include<cstring> #include<cstdio> #include<cmath> #define maxn 15 using namespace std; int n; double pos[maxn][maxn],l[maxn][maxn]; void guess(){ for(int i=1;i<=n;i++){ int t=i; for(int j=i+1;j<=n;j++) if(fabs(l[j][i])>fabs(l[t][i]))t=j; if(t!=i)for(int j=i;j<=n+1;j++)swap(l[i][j],l[t][j]); for(int j=i+1;j<=n;j++){ double x=l[j][i]/l[i][i]; for(int k=i;k<=n+1;k++)l[j][k]-=l[i][k]*x; } } for(int i=n;i>=1;i--){ for(int j=i+1;j<=n;j++)l[i][n+1]-=l[j][n+1]*l[i][j]; l[i][n+1]/=l[i][i]; } } int main(){ scanf("%d",&n); for(int i=1;i<=n+1;i++) for(int j=1;j<=n;j++){ scanf("%lf",&pos[i][j]); if(i!=1){ l[i-1][j]=2*(pos[i][j]-pos[i-1][j]); l[i-1][n+1]+=pos[i][j]*pos[i][j]-pos[i-1][j]*pos[i-1][j]; } } guess(); for(int i=1;i<=n;i++){ printf("%.3lf",l[i][n+1]); if(i!=n)printf(" "); } }
poj3185
#include<iostream> #include<cstdio> #include<cstring> #define INF 0x3fffffff #define maxn 20 using namespace std; int a[22][22],x[22],free_n; int gcd(int a,int b){ if(a<0)return gcd(-a,b); if(b<0)return gcd(a,-b); return b==0?a:gcd(b,a%b); } int guass(){ int k,col=0; for(k=0;k<20&&col<20;k++,col++){ int mx=k; for(int i=k+1;i<20;i++) if(a[i][col]>a[mx][col])mx=i; for(int i=k;i<21;i++)swap(a[k][i],a[mx][i]); if(!a[k][col]){k--;continue;} for(int i=k+1;i<20;i++){ if(a[i][col]!=0){ int lcm=a[k][col]/gcd(a[k][col],a[i][col])*a[i][col]; int ta=lcm/a[i][col],tb=lcm/a[k][col]; if(a[i][col]*a[k][col]<0)tb=-tb; for(int j=col;j<21;j++) a[i][j]=((a[i][j]*ta)%2-(a[k][j]*tb)%2+2)%2; } } } for(int i=0,j;i<20;i++){ if(!a[i][i]){ for(j=i+1;j<20;j++) if(a[i][j])break; if(j==20)break; for(int r=0;r<20;r++)swap(a[r][i],a[r][j]); } } int mn=INF; for(int j=0;j<(1<<(20-k));j++){ for(int i=0;i<(20-k);i++) if(j&(1<<i))x[20-1-i]=1; else x[20-1-i]=0; for(int i=k-1;i>=0;i--){ int tmp=a[i][20]%2; for(int j=i+1;j<20;j++) if(a[i][j])tmp=(tmp-a[i][j]*x[j]%2+2)%2; x[i]=(tmp/a[i][i])%2; } int tmp=0; for(int i=0;i<20;i++)tmp+=x[i]; mn=min(mn,tmp); if(mn==0)break; } return mn; } int main(){ freopen("Cola.txt","r",stdin); for(int i=0;i<20;i++){//枚举对每个数字进行操作 scanf("%d",&a[i][20]); a[i][i]=1; if(i>0)a[i-1][i]=1; if(i<19)a[i+1][i]=1; } printf("%d",guass()); }
poj2947
/* 求解同余方程组问题。 与一般求解线性方程组的问题类似,只要在求解过程中加入取余即可。 注意:当方程组唯一解时,求解过程中要保证解在[3, 9]之间。 */ #include<iostream> #include<cstdio> #include<cstring> #define maxn 310 using namespace std; int n,m,a[maxn][maxn],ans[maxn]; char str[8][10]={"S","MON","TUE","WED","THU","FRI","SAT","SUN"}; char s1[10],s2[10]; int guass(){ int k=1,num=0; for(int i=1;i<=m&&k<=n;i++){//一共n个未知量 int p=m+1; for(int j=i;j<=m;j++)if(a[j][k]){p=j;break;}//可以用第j个工程求第k个零件,与高斯消元模板中取最大是一样的 if(p==m+1){k++;i--;continue;}//没有任何一个工程可以用来求第k个零件,那么求下一个零件 for(int j=1;j<=n+1;j++)swap(a[i][j],a[p][j]);//因为我们只需要阶梯状的部分,所以从k开始也无所谓 for(int j=i+1;j<=m;j++){ if(!a[j][k])continue; int tmp=a[j][k]; for(int l=k;l<=n+1;l++){//将下面各个方程的这一项化为0 a[j][l]=a[i][l]*tmp-a[j][l]*a[i][k];//这里是为了保证所有数字都是整数 a[j][l]=(a[j][l]%7+7)%7; } } num++;k++; } for(int i=num+1;i<=m;i++)if(a[i][n+1])return 0;//无解 if(num!=n)return 1;//多解 for(int i=n;i>=1;i--){ for(int j=i+1;j<=n;j++){ a[i][n+1]=a[i][n+1]-ans[j]*a[i][j]; a[i][n+1]=(a[i][n+1]%7+7)%7; } ans[i]=0; for(int j=3;j<=9;j++){//枚举答案 if(a[i][i]*j%7==a[i][n+1])ans[i]=j; } } return 2; } int main(){ freopen("Cola.txt","r",stdin); while(1){ memset(a,0,sizeof(a)); scanf("%d%d",&n,&m); if(n==0&&m==0)return 0; int k1,k2,x,num; for(int i=1;i<=m;i++){ scanf("%d%s%s",&num,s1,s2); for(int j=1;j<=7;j++){ if(!strcmp(str[j],s1))k1=j; if(!strcmp(str[j],s2))k2=j; } a[i][n+1]=(k2-k1+1+7)%7; for(int j=1;j<=num;j++){ scanf("%d",&x); a[i][x]++; if(a[i][x]>=7)a[i][x]-=7; } } k1=guass(); if(k1==0)printf("Inconsistent data.\n"); else if(k1==1)printf("Multiple solutions.\n"); else{ for(int i=1;i<=n;i++)printf("%d ",ans[i]); puts(""); } } }