# 高斯消元

74 篇文章 3 订阅
9 篇文章 0 订阅

## 算法步骤

2x+yz=2x+2yz=5xy+2z=7

211121112257

200130114288

3yz=8y=(8+z)/3 $3y-z=8 y=(8+z)/3$,得到 y=2 $y=2$
2x+yz=2 $2x+y-z=2$解出 x=1 $x=-1$

## 例题及代码

### 洛谷P3389

#include<iostream>
#include<cstdio>
#include<climits>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
double a[105][105];
int n;
bool gauss(){
int k,i,j,bj;double t;
for(k=0;k<n;k++){
bj=k;
for(i=k+1;i<n;i++)
if(fabs(a[i][k])>fabs(a[bj][k]))bj=i;
if(fabs(a[bj][k])<1e-8)return 0;
for(j=k;j<=n;j++)swap(a[bj][j],a[k][j]);
t=a[k][k];
for(j=k;j<=n;j++)a[k][j]/=t*1.0;
for(i=0;i<n;i++)if(k!=i){//notice:if
t=a[i][k];
for(j=k;j<=n;j++)a[i][j]-=a[k][j]*t*1.0;
}
}
return 1;
}
int main()
{
int i,j;
scanf("%d",&n);
for(i=0;i<n;i++)
for(j=0;j<n+1;j++)scanf("%lf",&a[i][j]);
if(gauss())for(i=0;i<n;i++)printf("%.2lf\n",a[i][n]);
else printf("No Solution");
return 0;
}

### 洛谷P2962

#include<iostream>
#include<cstdio>
#include<climits>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
int q=0;char ch=' ';
while(ch<'0'||ch>'9')ch=getchar();
while(ch>='0'&&ch<='9')q=q*10+ch-'0',ch=getchar();
return q;
}
int n,m,ans=INT_MAX;
int a[40][40],x[40];
void gauss(){
int i,j,bj,k;
for(k=1;k<=n;k++){
bj=k;
for(i=k+1;i<=n;i++)if(a[i][k]){bj=i;break;}
if(bj!=k)for(j=1;j<=n+1;j++)swap(a[bj][j],a[k][j]);
for(i=k+1;i<=n;i++)if(a[i][k]){
for(j=1;j<=n+1;j++)a[i][j]^=a[k][j];
}
}
}
void dfs(int xx,int tot){
if(tot>ans)return;
if(!xx){ans=min(ans,tot);return;}
if(a[xx][xx]){
x[xx]=a[xx][n+1];
for(int j=n;j>xx;j--)x[xx]^=x[j]&a[xx][j];
if(x[xx])dfs(xx-1,tot+1);
else dfs(xx-1,tot);
}
else {
x[xx]=0;dfs(xx-1,tot);
x[xx]=1;dfs(xx-1,tot+1);
}
}
int main()
{
int i,j,xx,yy;
for(i=1;i<=n;i++)a[i][n+1]=1,a[i][i]=1;
gauss();dfs(n,0);printf("%d",ans);
return 0;
}

## 期望与高斯消元

### HDU4418

#include<iostream>
#include<cstdio>
#include<climits>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
int T,tot,n,m,v,u,d;
int g[205],q[205];
double p[205],a[205][205],eps=1e-6;
void bfs(){
int i,he=1,ta=1,to;
q[he]=u;g[u]=tot++;
while(he<=ta){
for(i=1;i<=m;i++){
if(fabs(p[i])<eps)continue;
to=(q[he]+i)%n;
if(g[to]==-1){g[to]=tot++;q[++ta]=to;}
}
he++;
}
}
bool guss(){
int i,j,k,bj;double t;
for(k=0;k<tot;k++){
bj=k;
for(i=k+1;i<tot;i++)
if(fabs(a[i][k])>fabs(a[bj][k]))bj=i;
if(fabs(a[bj][k])<eps)return 0;
if(bj!=k)for(j=k;j<=tot;j++)swap(a[k][j],a[bj][j]);
t=a[k][k];
for(j=k;j<=tot;j++)a[k][j]/=t;
for(i=0;i<tot;i++)if(i!=k){
if(fabs(a[i][k])<eps)continue;
t=a[i][k];
for(j=k;j<=tot;j++)a[i][j]-=t*a[k][j];
}
}
return 1;
}
int main()
{
int i,j;
scanf("%d",&T);
while(T--){
scanf("%d%d%d%d%d",&n,&m,&v,&u,&d);
for(i=1;i<=m;i++){scanf("%lf",&p[i]);p[i]/=100.0;}
if(u==v){printf("0.00\n");continue;}
n=n*2-2;if(d==1&&u!=0)u=n-u;
for(i=0;i<n;i++)g[i]=-1;
tot=0;bfs();
if(g[v]==-1&&g[n-v]==-1){printf("Impossible !\n");continue;}
memset(a,0,sizeof(a));
for(i=0;i<n;i++){
if(g[i]==-1)continue;
a[g[i]][g[i]]=1.0;
if(i==v||i==n-v)continue;
for(j=1;j<=m;j++){
if(fabs(p[j])<eps)continue;
int to=(i+j)%n;
if(g[to]==-1)continue;
a[g[i]][g[to]]-=p[j];a[g[i]][tot]+=p[j]*j;
}
}
if(!guss()){printf("Impossible !\n");continue;}
printf("%.2lf\n",a[g[u]][tot]);
}
return 0;
}

• 1
点赞
• 2
收藏
觉得还不错? 一键收藏
• 0
评论
12-22 58
06-21 152
12-22 107
04-09
09-06
06-19
12-17 504
12-08 3万+
08-15 3万+
01-31 102
09-10 761
07-26 1096

### “相关推荐”对你有帮助么？

• 非常没帮助
• 没帮助
• 一般
• 有帮助
• 非常有帮助

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