Cod sursa(job #1400445)

Utilizator VictoriaNevTascau Victoria VictoriaNev Data 25 martie 2015 12:07:51
Problema Tunelul groazei Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.28 kb
#include <vector>
#include <fstream>
#include <cmath>
#include <cstring>
#include <iomanip>
using namespace std;
const double eps=0.0000000001;
const int NMAX=260;
int n, i, x, y, c, k;
double sol[NMAX], a[NMAX][NMAX];
vector< pair<int,int> > g[NMAX];
void gauss()
{
    int i, j, l, k;
    for(j=1; j<=n; ++j)
    {
        for(i=j; i<=n; ++i)
            if(a[i][j])
                break;
        for(l=1; l<=n; ++l)
            swap(a[i][l], a[j][l]);
        swap(sol[i],sol[j]);
        for(i=1; i<=n; ++i)
            if(i!=j)
            {
                double sp=a[i][j]/a[j][j];
                for(k=1; k<=n; ++k)
                    a[i][k]-=sp*a[j][k];
                sol[i]-=sp*sol[j];
            }
    }
}
int main()
{
    ifstream in("tunel.in");
    ofstream out("tunel.out");
    in>>n>>k;
    for(i=1; i<=k; i++)
    {
        in>>x>>y>>c;
        g[x].push_back(make_pair(y,c));
        g[y].push_back(make_pair(x,c));
    }
    for(i=1; i<n; i++)
    {
        a[i][i]=1.00;
        double coef=(double)1.00/g[i].size();
        for(vector< pair<int,int> >::iterator it=g[i].begin(); it!=g[i].end(); it++)
        {
            a[i][it->first]-=coef;
            sol[i]+=coef*it->second;
        }
    }
    a[n][n]=1;
    gauss();
    out<<setprecision(4)<<sol[1]<<'\n';
    return 0;
}