Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 326 Accepted Submission(s): 156
高斯消元解方程组。
主要是方程的建立。
我建方程使用了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个变量多余了。