[Gauss]HDOJ3976 Electric resistance

题意: 一看图就明白了 要求的是1与n端点间的等效电阻

 

重点在于转化成考虑电流

根据KCL定理在任一瞬间流出(流入)该节点的所有电流的代数和恒为零

       U = IR

 可以令1点的电势为零 那么n点的电势就等于它的等效电阻

 

可以列出方程组  $\sum\limits \frac{U_j-U_i}{R_ij} + I = 0$

         $U_0$ = 0;

 

[Gauss]HDOJ3976 Electric resistance
 1 double a[300][300];  // 增广矩阵

 2 double x[300];  //

 3 int free_x[300]; // 标记是否为自由未知量

 4 

 5 void Gauss(int n, int m) // n个方程 m个未知数 即 n行m+1列

 6 {

 7     //转换为阶梯形式

 8     int col=0, k;

 9     for(k=0;k<n && col<m;k++, col++)

10     {//枚举行

11         int max_r=k;

12         for(int i=k+1;i<n;i++)//找到第col列元素绝对值最大的那行与第k行交换

13             if(fabs(a[i][col])>fabs(a[max_r][col]))

14                 max_r=i;

15         if(fabs(a[max_r][col])<eps)

16             return ;

17         if(max_r!=k)// 与第k行交换

18         {

19             for(int j=col;j<m;j++)

20                 swap(a[k][j], a[max_r][j]);

21             swap(x[k], x[max_r]);

22         }

23         x[k]/=a[k][col];

24         for(int i=col+1;i<m;i++)

25             a[k][i]/=a[k][col];

26         a[k][col]=1;

27         for(int i=0;i<m;i++)

28             if(i!=k)

29             {

30                 x[i]-=x[k]*a[i][k];

31                 for(int j=col+1;j<m;j++)

32                     a[i][j]-=a[k][j]*a[i][col];

33                 a[i][col]=0;

34             }

35     }

36 }

37 

38 void init()

39 {

40     memset(a, 0, sizeof(a));

41     memset(x, 0, sizeof(x));

42 }

43 

44 int main()

45 {

46     int T, ca=1;

47     scanf("%d", &T);

48     while(T--)

49     {

50         int n, m;

51         scanf("%d%d", &n, &m);

52         init();

53         for(int i=0;i<m;i++)

54         {

55             int X, Y, Z;

56             scanf("%d%d%d", &X, &Y, &Z);

57             X--, Y--;

58             a[X][Y]+=1.0/Z;

59             a[Y][X]+=1.0/Z;

60             a[X][X]-=1.0/Z;

61             a[Y][Y]-=1.0/Z;

62         }

63         printf("Case #%d: ", ca++);

64         fill(a[n-1], a[n-1]+n, 0);

65         a[n-1][0]=1;

66         x[0]=1;

67         Gauss(n, n);

68         printf("%.2lf\n", x[n-1]);

69     }

70     return 0;

71 }
HDOJ 3976

 

你可能感兴趣的:(res)