假设N的电势为0,电流为1
然后假设1~N-1的电势, 利用电流守恒来建立方程,解一个方程组即可。
又是标程……当满秩时高斯消元的模版好了
...这里都是电压。。。不是电阻,但是我们可以构造...
构造很简单...令Un = 0 ,I = 1 ;
那么电阻 R = (U1 - Un)/I
构造后 R = U1
这里的高斯模板用的是之前的双精度的模板, 满秩时高斯消元的模版,只有唯一解。
#include <cstdio>
#include <iostream>
#include <stdlib.h>
#include <cmath>
#include <cstring>
using namespace std;
double a[105][105];
double x[55];
int len;
void Debug(void)
{
int i, j;
for (i = 0; i < len; i++)
{
for (j = 0; j < len + 1; j++)
{
cout << a[i][j] << " ";
}
cout << endl;
}
cout << endl;
}
void gauss()
{
int id,i,j,k;
double max,temp;
for(k=0;k<len;k++)
{
max=fabs(a[k][k]);
id=k;
for(i=k+1;i<len;i++)
{
if(max<fabs(a[i][k]))
{
max=fabs(a[i][k]);
id=i;
}
}
if(id!=k)
{
for(i=0;i<=len;i++)
swap(a[k][i],a[id][i]);
}
//Debug();
temp=a[k][k];//注意后面a[k][k]变化了,调了半天
for(i=k;i<=len;i++)
{
a[k][i]/=temp;
}
//Debug();
for(i=0;i<len;i++)
{
if(i!=k)
{
temp=a[i][k];;//注意后面a[i][k]变化了,调了半天
for(j=k;j<=len;j++)
{
a[i][j]=a[i][j]-a[k][j]*temp;
}
}
}
}
return;
}
int main()
{
int i,j,k,t,cas=1,n,m,c;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
len=n;
for(i=0;i<len;i++)
for(j=0;j<len+1;j++)
a[i][j]=0;
while(m--)
{
scanf("%d%d%d",&i,&j,&c);
i--;j--;
a[i][i]+=1.0/c;
a[j][j]+=1.0/c;
a[i][j]-=1.0/c;
a[j][i]-=1.0/c;
}
a[0][len]=1;
a[len-1][len]=-1;
for(i=0;i<len;i++)
a[i][len-1]=a[i][len];
len--;
gauss();
printf("Case #%d: %.2lf\n",cas++,a[0][len]);
}
return 0;
}