bzoj2419

http://www.lydsy.com/JudgeOnline/problem.php?id=2419

∑Ui?UjRi,j=0∑Ui?UjRi,j=0

∑U1?UjR1,j=1∑U1?UjR1,j=1

∑Un?UjRi,n=?1∑Un?UjRi,n=?1

Un=0

这就是方程了。。。但是代码有点不理解

#include<bits/stdc++.h>
using namespace std;
const int N = 510;
double a[N][N], g[N][N];
int n, m;
void build()
{
    for(int i = 1; i <= n; ++i)
        for(int j = 1; j <= n; ++j)
            a[i][i] += g[i][j], a[i][j] -= g[i][j];
    a[1][n + 1] = 1.0;
    a[n][n + 1] = -1.0;
    a[n][n] += 1.0;
}
void gauss_jordan()
{
    for(int now = 1; now <= n; ++now)
    {
        int x = now;
        for(int i = now + 1; i <= n; ++i) if(fabs(a[i][now]) > fabs(a[x][now])) x = i;
        for(int i = 1; i <= n + 1; ++i) swap(a[now][i], a[x][i]);
        double t = a[now][now];
        for(int i = now; i <= n + 1; ++i) a[now][i] /= t;
        for(int i = 1; i <= n; ++i) if(i != now)
        {
            double t = a[i][now];
            for(int j = now; j <= n + 1; ++j) a[i][j] -= t * a[now][j];
        }
    }
}
int main()
{
    while(scanf("%d%d", &n, &m) != EOF)
    {
        memset(a, 0, sizeof(a));
        memset(g, 0, sizeof(g));
        for(int i = 1; i <= m; ++i)
        {
            int u, v; double r; scanf("%d%d%lf", &u, &v, &r);
            if(u == v) continue;
            g[u][v] += 1.0 / r; g[v][u] += 1.0 / r;
        }
        build();
        gauss_jordan();
        printf("%.2f\n", a[1][n + 1]);
    }
    return 0;
}

时间: 2024-10-13 21:16:51

bzoj2419的相关文章

FLAG!!!fighting!!!

你凭什么不努力 数据结构: LCT 主席树 fhqTreap 可持久化Treap 树套树 算法:(待加入) * FFT 能力: 动态规划思想 高级DP(状压,插头,优化技巧) 高斯消元 数学: 具体数学(阅读) 线性代数(阅读) 数论与代数结构 组合数学 (阅读) 做题 省选集训欠下的题 矩阵乘法 BZOJ1297: [SCOI2009]迷路 矩阵乘法 BZOJ1706: [usaco2007 Nov]relays 奶牛接力跑 矩阵乘法 BZOJ1898: [Zjoi2004]Swamp 沼泽鳄