Cod sursa(job #1926849)

Utilizator Radu_GeorgeRadu George Radu_George Data 14 martie 2017 18:48:00
Problema Tunelul groazei Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.42 kb
#include <bits/stdc++.h>
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define Nmax 260
#define eps 1e-3

using namespace std;

vector < pair <int,int> > L[Nmax];
int grad[Nmax],n,wh[Nmax];
double a[Nmax][Nmax];

inline void swapL(int l1, int l2)
{
    if(l1==l2) return;
    for(int i=1;i<=n+1;++i) swap(a[l1][i],a[l2][i]);
}

inline double Gauss()
{
    int i=1,j=1,k,t;
    while(i<=n+1 && j<=n)
    {
        for(k=i;k<=n+1 && fabs(a[k][j])<eps;++k);
        if(k==n+2)
        {
            ++j;
            continue;
        }
        swapL(k,i);
        for(k=1;k<=n+1;++k)
            if(k!=i)
            {
                double r=-a[k][j]/a[i][j];
                for(t=1;t<=n+1;++t) a[k][t]+=a[i][t]*r;
            }
        wh[i]=j;
        ++i; ++j;
    }
    for(i=1;i<=n+1;++i)
        if(wh[i]==1) return a[i][n+1]/a[i][1];
}

int main()
{
    int m,x,y,z,i;
    ifstream cin("tunel.in");
    ofstream cout("tunel.out");
    cin>>n>>m;
    while(m--)
    {
        cin>>x>>y>>z;
        L[x].pb(mp(y,z)); L[y].pb(mp(x,z));
        ++grad[x]; ++grad[y];
    }

    for(i=1;i<=n;++i)
    {
        a[i][i]=1;
        for(auto it : L[i])
        {
            a[i][it.fi]=(double) -1/grad[i];
            a[i][n+1]+=(double) it.se/grad[i];
        }
    }
    a[n+1][n]=1;

    cout<<setprecision(3)<<fixed<<Gauss()<<"\n";
    return 0;
}