Cod sursa(job #1700049)

Utilizator akaprosAna Kapros akapros Data 9 mai 2016 10:59:08
Problema Tunelul groazei Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.31 kb
#include <bits/stdc++.h>
#define maxN 257
#define e 0.0000000001
using namespace std;
int n, m, d[maxN][maxN];
double ans[maxN], a[maxN][maxN];
int V[maxN][maxN];
void read()
{
    int i;
    freopen("tunel.in", "r", stdin);
    scanf("%d %d", &n, &m);
    for (i = 1; i <= m; ++ i)
    {
        int a, b, c;
        scanf("%d %d %d", &a, &b, &c);
        d[a][b] += c;
        d[b][a] += c;
        V[a][++ V[a][0]] = b;
        V[b][++ V[b][0]] = a;
    }
}
void Swap(double &x, double &y)
{
    double aux;
    aux = x;
    x = y;
    y = aux;
}
void Gauss()
{
    int i = 1, j = 1;
    while (i <= n && j <= m)
    {
        int x, y;
        for (x = i; x <= n; ++ x)
            if (a[x][j] > e || a[x][j] < -e)
                break;
        if (x == n + 1)
        {
            ++ j;
            continue;
        }
        if (x != i)
            for (y = 1; y <= m + 1; ++ y)
                Swap(a[x][y], a[i][y]);

        for (y = j + 1; y <= m + 1; ++ y)
            a[i][y] = (double)(a[i][y] / a[i][j]);
        a[i][j] = 1.00000000000;

        for (y = i + 1; y <= n; ++ y)
        {
            int c;

            for (c = j + 1; c <= m + 1; ++ c)
                a[y][c] -= a[y][j] * a[i][c];
            a[y][j] = 0.0000000000;
        }
        ++ i;
        ++ j;
    }
}
void Coef()
{
    int i, j, x;
    for (i = n; i >= 1; -- i)
        for (j = 1; j <= m + 1; ++ j)
            if (a[i][j] > e || a[i][j] < -e)
            {
                if (j == m + 1)
                {
                    ans[0] = -1;
                    return ;
                }
                ans[j] = a[i][m + 1];
                for (x = j + 1; x <= m; ++ x)
                    ans[j] -= a[i][x] * ans[x];
                break;
            }
}
void solve()
{
    int i, j;
    for (i = 1; i < n; ++ i)
    {
        for (j = 1; j <= V[i][0]; ++ j)
        {
            a[i][V[i][j]] = (double)(1.0000 / V[i][0]);
            a[i][n + 1] -= (double)(1.0000 * d[i][V[i][j]] / V[i][0]);
        }
        a[i][i] = -1;
    }
    ans[n] = 0.000;
    m = n;
    -- n;
    Gauss();
    Coef();
}
void write()
{
    freopen("tunel.out", "w", stdout);
    printf("%.4lf", ans[1]);
}
int main()
{
    read();
    solve();
    write();
    return 0;
}