记录编号 601461 评测结果 AAAAAAAAAA
题目名称 1465.电阻问题 最终得分 100
用户昵称 Gravatar健康铀 是否通过 通过
代码语言 C++ 运行时间 0.122 s
提交时间 2025-06-24 16:47:08 内存使用 3.96 MiB
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;

const double E = 1e-12;

void g1(vector<vector<double>>& A, vector<double>& B, vector<double>& x) {
    int n = A.size();
    for (int k = 0; k < n; ++k) {
        int m = k;
        for (int i = k + 1; i < n; ++i) {
            if (fabs(A[i][k]) > fabs(A[m][k])) {
                m = i;
            }
        }
        if (m != k) {
            swap(A[k], A[m]);
            swap(B[k], B[m]);
        }

        if (fabs(A[k][k]) < E) {
            continue;
        }

        for (int i = k + 1; i < n; ++i) {
            double f = A[i][k] / A[k][k];
            for (int j = k; j < n; ++j) {
                A[i][j] -= f * A[k][j];
            }
            B[i] -= f * B[k];
        }
    }

    x.assign(n, 0.0);
    for (int i = n - 1; i >= 0; --i) {
        double s = 0.0;
        for (int j = i + 1; j < n; ++j) {
            s += A[i][j] * x[j];
        }
        if (fabs(A[i][i]) > E) {
            x[i] = (B[i] - s) / A[i][i];
        } else {
            x[i] = 0.0;
        }
    }
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
freopen("resistor.in","r",stdin);
	freopen("resistor.out","w",stdout);
    int n, m;
    cin >> n >> m;

    vector<vector<double>> g(n + 1, vector<double>(n + 1, 0.0));
    for (int i = 0; i < m; ++i) {
        int u, v;
        double r;
        cin >> u >> v >> r;
        double c = 1.0 / r;
        g[u][v] += c;
        g[v][u] += c;
    }

    if (n == 1) {
        cout << "0.00" << endl;
        return 0;
    }

    vector<double> t(n + 1, 0.0);
    for (int i = 1; i <= n; ++i) {
        for (int j = 1; j <= n; ++j) {
            t[i] += g[i][j];
        }
    }

    int s = n - 1;
    vector<vector<double>> A(s, vector<double>(s, 0.0));
    vector<double> B(s, 0.0);

    for (int i = 2; i <= n; ++i) {
        int r = i - 2;
        for (int j = 2; j <= n; ++j) {
            int c = j - 2;
            if (i == j) {
                A[r][c] = t[i];
            } else {
                A[r][c] = -g[i][j];
            }
        }
        if (i == n) {
            B[r] = 1.0;
        }
    }

    vector<double> x;
    g1(A, B, x);

    double a = 0.0;
    if (s > 0) {
        a = x[s - 1];
    }

    cout << fixed << setprecision(2) << a << endl;

    return 0;
}