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;
}
 
                    
                 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号