hdu 3976 Electric resistance——高斯消元

假设N的电势为0,电流为1

然后假设1~N-1的电势, 利用电流守恒来建立方程,解一个方程组即可。

又是标程……当满秩时高斯消元的模版好了

2011-08-26 20:54:21 Accepted 3976 0MS 236K 1093 B G++ Tiramitu

#include<cstdio>
#include
<cstdlib>
#include
<algorithm>
#include
<cmath>
#include
<cstring>

using namespace std;

double ans[60],d[60][60],eps=1e-9;
int n,m;

void gauss(double a[][60],int n,double x[])//为未知数的个数
{
int i,j,k,p;
for(j=0;j<n;j++)
{
for(i=j+1,p=j;i<n;i++)
if(fabs(a[i][j])>fabs(a[p][j]))
p
=i;
if(fabs(a[p][j])<eps)
return;
if(p!=j)
for(k=j;k<=n;k++)
swap(a[j][k],a[p][k]);
for(i=j+1;i<n;i++)
for(k=n;k>=j;k--)
a[i][k]
-=a[j][k]*a[i][j]/a[j][j];
}
for(j=n-1;j>=0;j--)
{
x[j]
=a[j][n]/a[j][j];
for(i=j-1;i>=0;i--)
a[i][n]
-=a[i][j]*x[j];
}
}

int main(void)
{
int i,j,k,l;
int T;
scanf(
"%d",&T);
int cas=0;
while(T--)
{
++cas;
scanf(
"%d %d",&n,&m);
memset(d,
0,sizeof(d));
while(m--)
{
scanf(
"%d %d %d",&j,&k,&l);
j
--,k--;
d[j][j]
-=1.0/l;
d[j][k]
+=1.0/l;
d[k][j]
+=1.0/l;
d[k][k]
-=1.0/l;
}
d[
0][n]=-1;
d[n
-1][n]=1;
for(i=0;i<n;i++)
d[i][n
-1]=d[i][n];
gauss(d,n
-1,ans);
printf(
"Case #%d: %.2f\n",cas,ans[0]);
}
return 0;
}

你可能感兴趣的:(HDU)