Cod sursa(job #1533741)

Utilizator tudormaximTudor Maxim tudormaxim Data 22 noiembrie 2015 21:53:42
Problema Tunelul groazei Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.37 kb
#include <cstdio>
#include <algorithm>
using namespace std;
const int nmax = 260;
int n, m, gr[nmax];
double a[nmax][nmax], val[nmax];

int main()
{
    freopen("tunel.in","r",stdin);
    freopen("tunel.out","w",stdout);
    scanf("%d %d", &n, &m);
    int i, j, x, y, c, k;
    double t;
    for (i=1; i<=m; i++)
    {
        scanf("%d %d %d", &x, &y, &c);
        gr[x]++;
        gr[y]++;
        a[x][y]++;
        a[y][x]++;
        a[x][n+1]-=c;
        a[y][n+1]-=c;
    }
    for (i=1; i<=n; i++)
        for (j=1; j<=n+1; j++) a[i][j]/=gr[i];
    for (i=1; i<n; i++)
    {
        a[i][n]=0;
        a[i][i]=-1;
    }
    for (j=1; j<n; j++)
    {
        for (i=j; i<=n; i++)
            if (a[i][j]) break;
        if (i!=j)
            for (k=1; k<=n+1; k++)
                swap(a[i][k], a[j][k]);
        for (i=j+1; i<=n+1; i++) a[j][i]/=a[j][j];
        a[j][j]=1;
        for (i=j+1; i<n; i++)
            {
                for (k=j+1; k<=n+1; k++)
                    a[i][k]-=a[i][j]*a[j][k];
                a[i][j]=0;
            }
    }
    for (i=n-1; i>0; i--)
        for (j=1; j<=n+1; j++)
            if (a[i][j])
            {
                val[j]=a[i][n+1];
                for (k=j+1; k<=n; k++)
                    val[j]-=val[k]*a[i][k];
                break;
            }
    printf("%.4lf\n",val[1]);
}