Cod sursa(job #2481230)

Utilizator RaduXD1Nicolae Radu RaduXD1 Data 26 octombrie 2019 17:14:02
Problema Tunelul groazei Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.56 kb
#include <fstream>
#include<queue>
#include<iomanip>
#define ver 0.000000001
using namespace std;
ifstream fin ("tunel.in");
ofstream fout("tunel.out");
int n,m,i,j,x,y,z,ok;
double aux,a[260][260],sol[260];
vector<pair<int,int> > v[260];
int main ()
{
    fin>>n>>m;
    for(i=1;i<=m;i++)
    {
        fin>>x>>y>>z;
        v[x].push_back(make_pair(y,z));
        v[y].push_back(make_pair(x,z));
    }
    for(i=1;i<n;i++)
    {
        a[i][i]=1;aux=v[i].size();
        for(auto it:v[i])
        {
            a[i][it.first]-=1.0/aux;
            a[i][n+1]+=1.0*it.second/aux;
        }
    }
    a[n][n]=1;
    x=1;y=1;
    while(x<=n&&y<=n)
    {
        ok=0;
        for(i=x;i<=n;i++)
        {
            if(a[i][y]<-ver||a[i][y]>ver)
            {
                ok=1;
                if(i!=x) for(j=1;j<=n+1;j++)
                    swap(a[i][j],a[x][j]);
                break;
            }
        }
        if(ok==0){y++;continue;}
        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[i][y]*a[x][j];
            a[i][y]=0;
        }
        x++;y++;
    }
    for(i=n;i>=1;i--)
    {
        ok=0;
        for(j=1;j<=n+1;j++)
            if(a[i][j]<-ver||a[i][j]>ver)
            {
                ok=j;
                break;
            }
        if(ok==0) continue;
        for(j=ok+1;j<=n;j++)  a[i][n+1]-=a[i][j]*sol[j];
        sol[ok]=a[i][n+1];
    }
    fout<<setprecision(5)<<fixed<<sol[1];
    return 0;
}