Cod sursa(job #640623)

Utilizator PetcuIoanPetcu Ioan Vlad PetcuIoan Data 26 noiembrie 2011 09:57:18
Problema Tunelul groazei Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.51 kb
#include<stdio.h>
#include<assert.h>
#include<vector>
using namespace std;

vector<int> a[256];
int n,m;
double s,d[256],sol[256],gus[256][256];

void read()
{
    assert(freopen("tunel.in","r",stdin)!=NULL);
    int i,x,y,c;
    scanf("%d%d",&n,&m);
    for(i=1;i<=m;++i)
    {
        scanf("%d%d%d",&x,&y,&c);
        a[x].push_back(y);
        a[x].push_back(c);
        a[y].push_back(x);
        a[y].push_back(c);
    }
}

void construct_system()
{
    int i,j;
    for(i=1;i<n;++i)
    {
        gus[i][i]=1;
        for(j=0;j<a[i].size();j+=2)
        {
            sol[i]+=(double)2/a[i].size()*a[i][j+1];
            gus[i][a[i][j]]-=(double)2/a[i].size();
        }
    }
    /*for(i=1;i<n;++i)
    {
        for(j=1;j<n;++j)
            printf("%lf ",gus[i][j]);
        printf("\n");
    }
    for(i=1;i<n;++i)
        printf("%lf\n",sol[i]);*/
}

void add_line(int x,int y,double cf)
{
    int i;
    sol[x]=(double)sol[x]+sol[y]*cf;
    for(i=1;i<n;++i)
        gus[x][i]=(double)gus[x][i]+gus[y][i]*cf;
}

void solve_system()
{
    int i,j;
    for(i=1;i<n;++i)
    {
        for(j=1;j<n;++j)
            if(i!=j && gus[i][i]!=0)
                add_line(j,i,(double)-gus[j][i]/gus[i][i]);
    }
    for(i=1;i<n;++i)
        d[i]=sol[i]/gus[i][i];
}

void solve()
{
    construct_system();
    solve_system();
    s=d[1];
}

void write()
{
    assert(freopen("tunel.out","w",stdout)!=NULL);
    printf("%lf",s);
}

int main()
{
    //assert(freopen("tunel.wa","w",stdout)!=NULL);
    read();
    solve();
    write();
    return 0;
}