Cod sursa(job #611101)

Utilizator crushackPopescu Silviu crushack Data 30 august 2011 17:52:42
Problema Tunelul groazei Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.2 kb
#include <stdio.h>
#include <vector>
#include <utility>
#include <algorithm>
#define NMax 256
using namespace std;

const char IN[]="tunel.in",OUT[]="tunel.out";

int N,M;
double T[NMax] , Mat[NMax][NMax];
vector<pair<int,int> > ad[NMax];

void solve()
{
    int i,j,k,l,col;

    for (i=j=0;i<N && j<N;++j)
    {
        double r;
        for (k=i;j<N && !Mat[k][i];++k);col=k;

        if (Mat[col][j])
        {
            for (k=0;k<=N;++k) swap(Mat[col][k],Mat[i][k]);
            r=Mat[i][j];
            for (k=0;k<=N;++k) Mat[i][k]/=r;
            for (k=i+1;k<N;++k)
            {
                r=Mat[k][j];
                for (l=j;l<=N;++l) Mat[k][l]-= Mat[i][l]*r;
            }
            ++i;
        }
    }

    for (i=N-1;i>=0;--i)
        for (T[i]=Mat[i][N],j=N-1;j>i;--j)
            T[i]-=T[j]*Mat[i][j];
}

int main()
{
    int i,j,x,y,c;
    freopen(IN,"r",stdin);
    scanf("%d%d",&N,&M);
    while (M--) scanf("%d%d%d",&x,&y,&c),--x,--y,++Mat[x][x], ++Mat[y][y],--Mat[x][y],--Mat[y][x],Mat[x][N]+=c,Mat[y][N]+=c;
    fclose(stdin);
    for (i=0;i<=N;++i) Mat[N-1][i]=0;
    Mat[N-1][N-1]=1;

    solve();

    freopen(OUT,"w",stdout);
    printf("%.8lf\n",T[0]);
    fclose(stdout);

    return 0;
}