记录编号 601481 评测结果 AAAAAAAAAA
题目名称 1465.电阻问题 最终得分 100
用户昵称 GravatarLikableP 是否通过 通过
代码语言 C++ 运行时间 0.092 s
提交时间 2025-06-24 21:35:01 内存使用 1.88 MiB
显示代码纯文本
#include <cmath>
#include <cstdio>
#include <utility>
#define isdigit(ch) ((ch) >= '0' && (ch) <= '9')

namespace IO {
template <typename T>
T read() {
  T res = 0, f = 1;
  char ch = getchar();
  for (; !isdigit(ch); ch = getchar())
    if (ch == '-')
      f = -1;
  for (; isdigit(ch); ch = getchar())
    res = (res << 3) + (res << 1) + (ch ^ 48);
  return res * f;
}
} // namespace IO
using namespace ::IO;

const int MAXN = 210;
const double eps = 1e-6;

int n, m;
double r[MAXN][MAXN]; // r[i][j] : 点 i 到点 j 之间的电阻的倒数
double a[MAXN][MAXN];

void Gauss_Jordan() {
  for (int i = 1; i <= n; ++i) {
    int row = i;
    for (int j = 1; j <= n; ++j) {
      if (fabs(a[j][i]) > eps && j < i)
        continue;
      if (fabs(a[j][i]) > fabs(a[row][i])) {
        row = j;
      }
    }
    ::std::swap(a[i], a[row]);

    if (fabs(a[i][i]) < eps)
      continue;

    for (int j = 1; j <= n; ++j) {
      if (i == j)
        continue;
      double delta = a[j][i] / a[i][i];
      for (int k = 1; k <= n + 1; ++k) {
        a[j][k] -= delta * a[i][k];
      }
    }
  }

  for (int i = 1; i <= n; ++i) {
    if (fabs(a[i][i]) < eps)
      continue;
    a[i][n + 1] /= a[i][i];
  }
}

int main() {
  freopen("resistor.in", "r", stdin);
  freopen("resistor.out", "w", stdout);
  n = read<int>(), m = read<int>();
  for (int i = 1; i <= m; ++i) {
    int u = read<int>(), v = read<int>(), k = read<int>();
    r[u][v] += 1.0 / k;
    r[v][u] += 1.0 / k;
  }

  // sum (ui - uj) / Rij = sum{ ui / rij - uj / rij } = 0;
  // (u1 - uj) / r1j = u1 / r1j - uj / r1j = 1
  // (ui - un) / rin = ui / rin

  for (int u = 1; u <= n - 1; ++u) {
    for (int v = 1; v <= n; ++v) {
      if (r[u][v] == 0)
        continue;
      a[u][u] += r[u][v];
      a[u][v] = -r[u][v];
    }
  }
  a[1][n + 1] = 1;
  a[n][n] = 1;

  Gauss_Jordan();

  printf("%.2lf\n", a[1][n + 1]);
  return 0;
}