zoukankan      html  css  js  c++  java
  • 【HDU】3976 Electric resistance

    题意:给出一个图,无重边,边权为电阻大小,求1~n的等效电阻。

    要知道等效电阻,很显然要知道电流和电势差。

    电阻必然是确定的,那么电势差会随流过电流的大小变化,为了方便,不妨设流入1节点的电流为1,n节点的电势为0。

    每个节点的电势视为未知数,那么根据KCL,流入节点的电流必然等于流出节点的电流,列出n个方程。结果就是电势差/I。

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<cmath>
     4 #include<algorithm>
     5 #define EPS 1e-8
     6 #define MAXN 55
     7 using namespace std;
     8 double r[MAXN][MAXN], g[MAXN][MAXN], u[MAXN];
     9 int n;
    10 void Gauss() {
    11     int i, j, k;
    12     double tmp;
    13     for (i = 0; i < n; i++) {
    14         tmp = 0;
    15         for (j = i; j < n; j++) {
    16             if (fabs(g[j][i]) > tmp) {
    17                 tmp = fabs(g[j][i]);
    18                 k = j;
    19             }
    20         }
    21         if (k != i) {
    22             for (j = i; j <= n; j++)
    23                 swap(g[k][j], g[i][j]);
    24         }
    25         for (j = i + 1; j < n; j++) {
    26             if (fabs(g[j][i]) > EPS) {
    27                 tmp = g[j][i] / g[i][i];
    28                 for (k = i; k <= n; k++)
    29                     g[j][k] -= g[i][k] * tmp;
    30             }
    31         }
    32     }
    33     for (i = n - 1; i >= 0; i--) {
    34         if (fabs(g[i][i]) < EPS)
    35             u[i] = 0;
    36         else {
    37             tmp = 0;
    38             for (j = i + 1; j < n; j++)
    39                 tmp += g[i][j] * u[j];
    40             tmp = g[i][n] - tmp;
    41             u[i] = tmp / g[i][i];
    42         }
    43     }
    44 }
    45 int main() {
    46     int c, ca = 1;
    47     int q, x, y, i, j;
    48     double tmp;
    49     scanf("%d", &c);
    50     while (c--) {
    51         scanf("%d%d", &n, &q);
    52         memset(r, 0, sizeof(r));
    53         memset(g, 0, sizeof(g));
    54         while (q--) {
    55             scanf("%d%d%lf", &x, &y, &tmp);
    56             x--, y--;
    57             r[x][y] = r[y][x] = tmp;
    58         }
    59         for (i = 0; i < n; i++) {
    60             for (j = 0; j < n; j++) {
    61                 if (r[i][j]) {
    62                     g[i][j] += 1 / r[i][j];
    63                     g[i][i] -= 1 / r[i][j];
    64                 }
    65             }
    66         }
    67         g[0][n] = -1, g[n - 1][n] = 1;
    68         Gauss();
    69         printf("Case #%d: %.2lf\n", ca++, u[0] - u[n - 1]);
    70     }
    71     return 0;
    72 }
    新博客:www.zhixiangli.com
  • 相关阅读:
    值类型引用类型的区别(转)
    聚集索引和非聚集索引(转)
    使用docker安装nginx并配置端口转发
    jenkins选择分支构建
    创建好docker后不能apt-get update解决方法
    Docker开启Remote API 访问 2375端口
    Docker加速配置
    Docker下载安装
    进入Docker 容器 docker exec [CONTAINER ID] bin/bash报错问题
    定时删除日志文件---linux定时清理日志
  • 原文地址:https://www.cnblogs.com/DrunBee/p/2671702.html
Copyright © 2011-2022 走看看