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 }
View Code

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3976

posted on 2015-03-05 00:31  xiao_xin  阅读(180)  评论(0编辑  收藏  举报

导航