Cod sursa(job #2530426)

Utilizator bogdi1bogdan bancuta bogdi1 Data 24 ianuarie 2020 19:32:13
Problema Tunelul groazei Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.83 kb
#include <cstdio>
#include <vector>
using namespace std;
const double eps = 1.e-7;
int grad[260];
struct Noduri
{
    int y,cost;
};
vector<Noduri> g[260];
double mat[260][260];
double sol[260];
int nredge[260][260];
int main()
{   freopen("tunel.in", "r", stdin);
    freopen("tunel.out", "w", stdout);
    int n,m,i,x,y,z,j,k,l;
    scanf("%d%d", &n, &m);
    for(i=1; i<=m; i++){
        scanf("%d%d%d", &x, &y, &z);
        g[x].push_back({y,z});
        g[y].push_back({x,z});
        grad[x]++;
        grad[y]++;
        nredge[x][y]++;
        nredge[y][x]++;
    }
    for(i=1; i<=n; i++){
        if(i!=n)
            mat[i][i]=1;
        for(j=0; j<g[i].size(); j++){
            if(g[i][j].y!=n)
                mat[i][g[i][j].y]=(-1.0*nredge[i][g[i][j].y])/(1.0*grad[i]);
            mat[i][n+1]+=(1.0*g[i][j].cost)/(1.0*grad[i]);
        }
    }
    for(i=1,j=1; i<=n && j<=n; i++,j++){
        for(k=i; k<=n; k++){
            if(mat[k][j]<=-eps || mat[k][j]>=eps){
                for(l=1; l<=n+1; l++)
                    swap(mat[k][l], mat[i][l]);
                break;
            }
        }
        if(mat[i][j]>=-eps && mat[i][j]<=eps){
            i--;
            continue;
        }
        for(k=j+1; k<=n+1; k++)
            mat[i][k]/=mat[i][j];
        mat[i][j]=1.0;
        for(k=i+1; k<=n; k++){
            for(l=j+1; l<=n+1; l++)
                mat[k][l]-=mat[k][j]*mat[i][l];
            mat[k][j]=0.0;
        }
    }
    for(i=n; i>=0; i--)
        for(j=1; j<=n; j++){
            if(mat[i][j]<=-eps || mat[i][j]>=eps){
                sol[j]=mat[i][n+1];
                for(l=j+1; l<=n; l++)
                    sol[j]-=mat[i][l]*sol[l];
                sol[j]/=mat[i][j];
                break;
            }
        }
    printf("%.4lf", sol[1]);
    return 0;
}