HDU 3976 Electric resistance (高斯消元法)

Electric resistance

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 326    Accepted Submission(s): 156

Problem Description Now give you a circuit who has n nodes (marked from 1 to n) , please tell abcdxyzk the equivalent resistance of the circuit between node 1 and node n. You may assume that the circuit is connected. The equivalent resistance of the circuit between 1 and n is that, if you only consider node 1 as positive pole and node n as cathode , all the circuit could be regard as one resistance . (It’s important to analyse complicated circuit ) At most one resistance will between any two nodes.

 

 

Input In the first line has one integer T indicates the number of test cases. (T <= 100)

Each test first line contain two number n m(1<n<=50,0<m<=2000), n is the number of nodes, m is the number of resistances.Then follow m lines ,each line contains three integers a b c, which means there is one resistance between node a and node b whose resistance is c. (1 <= a,b<= n, 1<=c<=10^4) You may assume that any two nodes are connected!  

 

Output for each test output one line, print “Case #idx: ” first where idx is the case number start from 1, the the equivalent resistance of the circuit between 1 and n. Please output the answer for 2 digital after the decimal point .  

 

Sample Input 1 4 5 1 2 1 2 4 4 1 3 8 3 4 19 2 3 12  

 

Sample Output Case #1: 4.21  

 

Author abcdxyzk  

 

Source
2011 Multi-University Training Contest 14 – Host by FZU  

 

 

高斯消元解方程组。

 

主要是方程的建立。

 

我建方程使用了n个未知数,表示n个点的电势。

 

需要列n个方程。

 

就根据n个点,流入电流等于流出电流,或者说每个点电流之和(假如流入为正,流出为负,反之也可)

这样可以列出n个方程,根据n个点电流和为0.

 

而且可以假设1这个点流入电流为-1, 这样设点电势为0,那么可以知道n这个点的电势就等于等效电阻了、。

 

流入肯定等于流出的,上面列的方程组中第n个的是多余的,可以去掉,替换成1点电压为0.

这样方程组正确建立。

 

对于u  —->  v  电阻为w.   可以知道u加一个电流  xv/w – xu/w.  而v加一个电流 xu/w – xv/w;    

 

 1 /* ***********************************************
 2 Author        :kuangbin
 3 Created Time  :2013-11-17 23:18:47
 4 File Name     :E:\2013ACM\比赛练习\2013-11-17\EE.cpp
 5 ************************************************ */
 6 
 7 #include <stdio.h>
 8 #include <string.h>
 9 #include <iostream>
10 #include <algorithm>
11 #include <vector>
12 #include <queue>
13 #include <set>
14 #include <map>
15 #include <string>
16 #include <math.h>
17 #include <stdlib.h>
18 #include <time.h>
19 using namespace std;
20 const double eps = 1e-9;
21 const int MAXN = 100;
22 double a[MAXN][MAXN],x[MAXN];
23 int equ,var;
24 int Gauss()
25 {
26     int i,j,k,col,max_r;
27     for(k = 0,col = 0;k < equ && col < var;k++,col++)
28     {
29         max_r = k;
30         for(i = k+1;i < equ;i++)
31             if(fabs(a[i][col]) > fabs(a[max_r][col]))
32                 max_r = i;
33         if(fabs(a[max_r][col]) < eps)return 0;
34         if(k != max_r)
35         {
36             for(j = col;j < var;j++)
37                 swap(a[k][j],a[max_r][j]);
38             swap(x[k],x[max_r]);
39         }
40         x[k]/=a[k][col];
41         for(j = col+1;j < var;j++)a[k][j]/=a[k][col];
42         a[k][col] = 1;
43         for(int i = 0;i < equ;i++)
44             if(i != k)
45             {
46                 x[i] -=  x[k]*a[i][k];
47                 for(j = col+1;j < var;j++)a[i][j] -= a[k][j]*a[i][col];
48                 a[i][col] = 0;
49             }
50     }
51     return 1;
52 }
53 int main()
54 {
55     //freopen("in.txt","r",stdin);
56     //freopen("out.txt","w",stdout);
57     int n,m;
58     int T;
59     int iCase = 0;
60     scanf("%d",&T);
61     while(T--)
62     {
63         iCase++;
64         scanf("%d%d",&n,&m);
65         equ = var = n;
66         memset(a,0,sizeof(a));
67         int u,v,w;
68         for(int i = 0;i < m;i++)
69         {
70             scanf("%d%d%d",&u,&v,&w);
71             a[u-1][v-1] += 1.0/w;
72             a[u-1][u-1] += -1.0/w;
73             a[v-1][u-1] += 1.0/w;
74             a[v-1][v-1] += -1.0/w;
75         }
76         for(int i = 0;i < n-1;i++)
77             x[i] = 0;
78         x[0] = 1;
79         for(int i = 0;i < n;i++)
80             a[n-1][i] = 0;
81         x[n-1] = 0;
82         a[n-1][0] = 1;
83         Gauss();
84         printf("Case #%d: %.2lf\n",iCase,x[n-1]);
85     }
86     return 0;
87 }

 

 

 

第一次写的时候用n+m个未知数做的,也可以A掉,但是有m个变量多余了。

 

 

 

 

 

 

 

 

 

 

 

 

 

    原文作者:算法小白
    原文地址: https://www.cnblogs.com/kuangbin/p/3428573.html
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞