zoukankan      html  css  js  c++  java
  • bzoj2419

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

    UiUjRi,j=0∑Ui−UjRi,j=0

    U1UjR1,j=1∑U1−UjR1,j=1

    UnUjRi,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
    ", a[1][n + 1]);
        }
        return 0;
    }
    View Code
  • 相关阅读:
    JSON
    类的操作
    轮播图
    定时器的应用
    延时调用
    定时器
    跳表的java实现,转载自网络,仅供自己学习使用
    java实现判断两个二叉树是否相同
    开发小白工作过程中的一些经验记录,仅供自己参看查阅,转载请注明出处
    安卓基础入门二,转载自网络
  • 原文地址:https://www.cnblogs.com/19992147orz/p/6822627.html
Copyright © 2011-2022 走看看