Cod sursa(job #977943)

Utilizator misinozzz zzz misino Data 27 iulie 2013 10:41:40
Problema Tunelul groazei Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.33 kb
#include<fstream>
#include<vector>
#include<iomanip>
#define eps 0.0001
using namespace std;
ifstream f("tunel.in");
ofstream g("tunel.out");
int n,m,i,j,l,k,x,y,c;
double a[256][256],r;
vector<pair<int,int> >v[256];
inline double abs(double x)
{
    if(x<0)
    return -x;
    return x;
}
int main()
{
    f>>n>>m;
    for(i=1;i<=m;++i)
    {
        f>>x>>y>>c;
        v[x].push_back(make_pair(y,c));
        v[y].push_back(make_pair(x,c));
    }
    a[n][n]=1;
    for(i=1;i<n;++i)
    {
        r=1.0/v[i].size();
        a[i][i]=1;
        for(vector<pair<int,int> >::iterator it=v[i].begin();it!=v[i].end();++it)
        {
            a[i][it->first]-=r;
            a[i][n+1]+=(it->second)*r;
        }
    }

    for(i=j=1;i<=n&&j<=n;)
    {
        for(k=i;k<=n;++k)
        if(abs(a[k][j])>eps)
        break;
        if(k==n+1)
        {
            ++j;
            continue;
        }
        if(i!=k)
        {
            for(l=1;l<=n+1;++l)
            swap(a[i][l],a[k][l]);
        }
        for(l=1;l<=n;++l)
        if(l!=j)
        {
            r=-a[l][j]/a[j][j];
            for(k=1;k<=n;++k)
            a[l][k]+=r*a[j][k];
            a[l][n+1]+=r*a[j][n+1];
        }
        ++i;
        ++j;
    }
    g<<fixed<<setprecision(6)<<a[1][n+1]<<'\n';
    return 0;
}