Cod sursa(job #2735605)

Utilizator armigheGheorghe Liviu Armand armighe Data 2 aprilie 2021 16:49:29
Problema Tunelul groazei Scor 70
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.42 kb
#include<bits/stdc++.h>
#pragma GCC optimize ("O3")
#pragma GCC optimize ("unroll-loops")
#pragma GCC optimize("Ofast")
#define eps 0.0001
using namespace std;
ifstream f("tunel.in");
ofstream g("tunel.out");
long double a[260][260],v[260];//v[x]=expected value de a ajunge de la x la n
//v[x]=sum(v[y]+cost[x][y])/nr_muchii
bool zero(long double x)
{
    if(x<eps&&x>-eps)
        return 1;
    return 0;
}

int main()
{
    int n,i,j,x,y,m,z;
    f>>n>>m;
    for(j=1;j<=m;j++)
    {
        f>>x>>y>>z;
        a[x][y]--;
        a[y][x]--;
        a[x][n+1]+=z;
        a[y][n+1]+=z;
        a[x][x]++;
        a[y][y]++;
    }
    x=1;
    y=1;
    while(x<=n&&y<=n)
    {
        for(i=x;i<=n;i++)
        if(!zero(a[i][y]))
            break;
        if(i!=n+1)
        {
            if(i!=x)
                swap(a[x],a[i]);
            for(j=y+1;j<=n+1;j++)
                a[x][j]/=a[x][y];
            a[x][y]=1;
            for(i=x+1;i<=n;i++)
            {
                for(j=y+1;j<=n+1;j++)
                    a[i][j]-=a[x][j]*a[i][y];
                a[i][y]=0;
            }
            x++;
        }
        y++;
    }
    for(x=n;x>=1;x--)
    {
        for(y=1;y<=n+1;y++)
        if(!zero(a[x][y]))
            break;
        v[y]=a[x][n+1];
        for(j=y+1;j<=n;j++)
            v[y]-=a[x][j]*v[j];
    }
    g<<fixed<<setprecision(5)<<v[1]<<" ";
    return 0;
}