zoukankan      html  css  js  c++  java
  • 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
     

    高斯消元解方程组。

    主要是方程的建立。

    我建方程使用了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-17EE.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
    ",iCase,x[n-1]);
    85     }
    86     return 0;
    87 }

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

  • 相关阅读:
    CUDA从入门到精通
    [Network] 计算机网络基础知识总结
    第三章 需求工程概论
    jsp学习
    算法——递推算法
    大话设计模式读书笔记--文章汇总
    轻松学SQL Server数据库
    Oracle数据库建表+添加数据练习
    《C#图解教程》 总览
    php发送get、post请求的6种方法简明总结
  • 原文地址:https://www.cnblogs.com/kuangbin/p/3428573.html
Copyright © 2011-2022 走看看