Cod sursa(job #1161701)

Utilizator poptibiPop Tiberiu poptibi Data 31 martie 2014 13:30:55
Problema Tunelul groazei Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.47 kb
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <algorithm>
using namespace std;

const int NMAX = 260;
const double EPS = 1e-4;

int N, M, X, Y, C, Deg[NMAX];
double A[NMAX][NMAX];

void DoGauss()
{
    int Ec = 1, Nec = 1;
    while(Ec < N && Nec <= N)
    {
        int i;
        for(i = Ec; i <= N; ++ i)
            if(fabs(A[i][Nec]) > EPS)
                break;

        if(i == N + 1)
        {
            Nec ++;
            continue;
        }

        for(int k = 1; k <= N + 1; ++ k)
            swap(A[i][k], A[Ec][k]);

        for(int i = 1; i <= N; ++ i)
            if(i != Ec)
            {
                double R = A[i][Nec] / A[Ec][Nec];
                for(int j = Nec; j <= N + 1; ++ j)
                    A[i][j] -= A[Ec][j] * R;
            }

        Ec ++;
        Nec ++;
    }

    printf("%.3lf\n", A[1][N + 1] / A[1][1]);
}

int main()
{
    freopen("tunel.in", "r", stdin);
    freopen("tunel.out", "w", stdout);

    scanf("%i %i", &N, &M);
    for(int i = 1; i <= M; ++ i)
    {
        scanf("%i %i %i", &X, &Y, &C);
        Deg[X] ++;
        Deg[Y] ++;
        A[X][Y] ++;
        A[Y][X] ++;
        A[X][N + 1] -= C;
        A[Y][N + 1] -= C;
    }

    for(int i = 1; i < N; ++ i)
    {
        for(int j = 1; j <= N + 1; ++ j)
            A[i][j] /= Deg[i];
        A[i][i] = -1;
    }

    for(int i = 1; i <= N + 1; ++ i)
        A[N][i] = A[i][N] = 0;

    DoGauss();
}