Cod sursa(job #611092)

Utilizator crushackPopescu Silviu crushack Data 30 august 2011 17:22:13
Problema Tunelul groazei Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.29 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,col;

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

    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,ad[x].push_back(make_pair(y,c)),ad[y].push_back(make_pair(x,c));
    fclose(stdin);

    --N;
    for (i=0;i<N;++i)
    {
        Mat[i][i]=-1;
        double r=1./ad[i].size();
        for (j=0;j<(int)ad[i].size();++j)
            if (ad[i][j].first!=N) Mat[i][N]-=r*ad[i][j].second,Mat[i][ad[i][j].first]=r;
            else Mat[i][N]-=r*ad[i][j].second;
    }

    solve();

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

    return 0;
}