hdu3976 多个电阻串并联在一起求等效电阻:高斯消元
尼玛物理渣连带着acm都不会了,KCL竟然想了半天!
设n个节点的电势未知数,设入点电流为1,出点电流为1,然后可以利用KCL列出n个表达式求解,最后入点电势-出点电势即为等效电阻==
又打了一遍我这个小数精度低的高斯消元模板,感觉已经可以手打啦==接下来再做几天的经典高消模型
1 #include<stdio.h> 2 #include<string.h> 3 #include<cmath> 4 #include<algorithm> 5 using namespace std; 6 #define eps 1e-8 7 int col,row; 8 double g[55][55],x[55]; 9 int guass() 10 { 11 int i,j,tr,tc,max_r; 12 for (tr=1,tc=1;tc<=col;tc++) 13 { 14 max_r=tr; 15 for (i=tr;i<=row;i++) 16 if (fabs(g[i][tc])>fabs(g[max_r][tc])) max_r=i; 17 if (fabs(g[max_r][tc])<eps) return 0; 18 if (max_r!=tr) 19 { 20 for (j=tc;j<=col;j++) 21 swap(g[tr][j],g[max_r][j]); 22 swap(x[tr],x[max_r]); 23 } 24 for (j=tc+1;j<=col;j++) g[tr][j]/=g[tr][tc]; 25 x[tr]/=g[tr][tc]; g[tr][tc]=1; 26 for (i=1;i<=row;i++) 27 if (i!=tr) 28 { 29 x[i]-=x[tr]*g[i][tc]; 30 for (j=tc+1;j<=col;j++) g[i][j]-=g[tr][j]*g[i][tc]; 31 g[i][tc]=0; 32 } 33 tr++; 34 } 35 return 1; 36 } 37 int main() 38 { 39 int T,t,n,m,u,v,w,i,j; 40 scanf("%d",&T); 41 for (t=1;t<=T;t++) 42 { 43 scanf("%d%d",&n,&m); 44 memset(g,0,sizeof(g)); 45 memset(x,0,sizeof(x)); 46 x[1]=-1.0; 47 x[n]=1.0; 48 while (m--) 49 { 50 scanf("%d%d%d",&u,&v,&w); 51 g[u][u]-=1.0/w; 52 g[u][v]+=1.0/w; 53 g[v][v]-=1.0/w; 54 g[v][u]+=1.0/w; 55 } 56 row=col=n; 57 guass(); 58 printf("Case #%d: %.2lf\n",t,x[1]-x[n]); 59 } 60 return 0; 61 }