Cod sursa(job #1533738)

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

int main()
{
    ifstream fin ("tunel.in");
    ofstream fout ("tunel.out");
    ios_base::sync_with_stdio(false);
    int i, j, x, y, c, k;
    double t;
    fin >> n >> m;
    for (i=1; i<=m; i++)
    {
        fin >> 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;
            }
    fout << setprecision(4) << val[1];
    fin.close();
    fout.close();
    return 0;
}