Cod sursa(job #1462925)

Utilizator chiriacandrei25Chiriac Andrei chiriacandrei25 Data 19 iulie 2015 14:04:24
Problema Tunelul groazei Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.19 kb
#include <fstream>
#include <vector>
#include <cmath>
#include <iomanip>
#define Nmax 300
#define eps 0.001
#define pb push_back

using namespace std;

int grad[Nmax],sum[Nmax],n;
double a[Nmax][Nmax];
vector <int> L[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]);
}

int main()
{
    int x,y,z,m,i,j,k;
    ifstream cin("tunel.in");
    ofstream cout("tunel.out");
    cin>>n>>m;
    while(m--)
    {
        cin>>x>>y>>z;
        L[x].pb(y); L[y].pb(x);
        ++grad[x]; ++grad[y];
        sum[x]+=z; sum[y]+=z;
    }
    for(i=1;i<=n;++i)
    {
        a[i][i]=1;
        for(auto it : L[i]) a[i][it] += (double)-1 / grad[i];
        a[i][n+1]=((double)1 / grad[i]) * sum[i];
    }
    a[n+1][n]=1; /// dp[n] = 0;
    for(i=1;i<=n;++i)
    {
        for(j=i;j<=n+1 && fabs(a[j][i])<=eps;++j);
        SwapL(i,j);
        for(j=1;j<=n+1;++j)
            if(j!=i)
            {
                double rap=-(a[j][i]/a[i][i]);
                for(k=1;k<=n+1;++k) a[j][k]+=rap*a[i][k];
            }
    }
    cout<<setprecision(10)<<fixed;
    cout<<a[1][n+1]/a[1][1]<<"\n";
    return 0;
}