记录编号 |
601481 |
评测结果 |
AAAAAAAAAA |
题目名称 |
1465.电阻问题 |
最终得分 |
100 |
用户昵称 |
LikableP |
是否通过 |
通过 |
代码语言 |
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;
}