Cod sursa(job #1883393)

Utilizator binicBinica Nicolae binic Data 17 februarie 2017 22:36:32
Problema Tunelul groazei Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.83 kb
#include<bits/stdc++.h>
using namespace std;
int n,m,x,y,p, gr[270],v[270][270];
double rap,ras,c,dist[270][270],ec[270][270];
double mod(double x) { return x > 0 ? x : -x; }
double eps = 1e-7;
int main ()
{
    freopen ("tunel.in", "r", stdin);
    freopen ("tunel.out", "w", stdout);
    scanf("%d %d", &n, &m);
    for (int i = 1; i <= m; i++)
    {
        scanf ("%d %d %lf", &x, &y, &c);
        if(dist[x][y] == 0)
        {
            gr[x] ++;
            gr[y] ++;
            v[x][gr[x]] = y;
            v[y][gr[y]] = x;
            dist[x][y] = c;
            dist[y][x] = c;
        }
        else
        {
            dist[x][y] = max(dist[x][y],c);
            dist[y][x] = max(dist[y][x],c);
        }
    }
    ///x[i] = suma(d[i][j] +x[j]) * (1/gr[i])
    /// x[i] * gr[i] = suma(x[j])  + suma(d[i][j])
    /// -suma(d[i][j]) = -x[i] * gr[i] + suma(x[j])
    for (int i = 1; i <= n-1; i++)
    {
        ec[i][i] = gr[i]*1.0;
        for (int j = 1; j <= gr[i]; j++)
        {
            ec[i][v[i][j]] -= 1.0;
            ec[i][n+1] += dist[i][v[i][j]];
        }
    }
    for (int i = 1; i < n; i++)
    {
        for(int j = 1; j < n; j++)
            if(mod (ec[i][j]) >= eps)
            {
                p=j;
                break;
            }

        if(p == 0) continue;

        rap = 0;
        for (int j = 1; j <= n; j++)
            if(j != i && mod ( ec[j][p] ) >= eps)
            {
                rap = (double) ec[j][p] / ec[i][p];
                for ( int k = 1; k <= n+1; k++)
                    ec[j][k] = (double) ec[j][k] - ec[i][k] * rap;
            }
    }
    for(int i = 1; i <= n; i++)
        if(mod(ec[i][1]) > 0)
        {
            ras = (double) ec[i][n+1] / ec[i][1];
            break;
        }
    printf("%.5lf", ras);
    return 0;
}