Cod sursa(job #1250213)

Utilizator george_stelianChichirim George george_stelian Data 27 octombrie 2014 21:46:45
Problema Tunelul groazei Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.38 kb
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <vector>

using namespace std;

const double eps=0.000000001;
double v[300][300],sol[300];
vector<int> g[300];

int main()
{
    freopen("tunel.in", "r", stdin);
    freopen("tunel.out", "w", stdout);
    int n,m,x,y,s;
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;i++)
    {
        scanf("%d%d%d",&x,&y,&s);
        g[x].push_back(y);
        g[y].push_back(x);
        v[x][n+1]+=s;v[y][n+1]+=s;
    }
    for(int i=1;i<n;i++)
    {
        x=g[i].size();
        v[i][i]=1;
        v[i][n+1]/=(double)x;
        for(vector<int>::iterator it=g[i].begin();it!=g[i].end();it++) v[i][*it]-=(double)1/x;
    }
    int i=1,j=1,q;
    while(i<n && j<=n)
    {
        for(q=i;q<n;q++) if(abs(v[q][j])>eps) break;
        if(q==n) {j++;continue;}
        if(i<q) for(int k=1;k<=n+1;k++) swap(v[i][k],v[q][k]);
        for(q=j+1;q<=n+1;q++) v[i][q]/=v[i][j];
        v[i][j]=1;
        for(q=i+1;q<n;q++)
        {
            for(int k=j+1;k<=n+1;k++) v[q][k]-=v[i][k]*v[q][j];
            v[q][j]=0;
        }
        i++;j++;
    }
    for(i=n-1;i;i--)
        for(j=i;j<=n+1;j++)
            if(v[i][j]==1)
            {
                sol[j]=v[i][n+1];
                for(q=j+1;q<=n;q++) sol[j]-=v[i][q]*sol[q];
                break;
            }
    printf("%lf",sol[1]);
    return 0;
}