Cod sursa(job #2480496)

Utilizator NicolaalexandraNicola Alexandra Mihaela Nicolaalexandra Data 25 octombrie 2019 17:52:53
Problema Tunelul groazei Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.91 kb
#include <fstream>
#include <vector>
#include <iomanip>
#define DIM 300
#define EPS 0.0001
using namespace std;

ifstream fin ("tunel.in");
ofstream fout ("tunel.out");
vector <int> L[DIM];
int dist[DIM][DIM],sum_dist[DIM],grad[DIM];
int n,m,i,j,x,y,c;
double a[DIM][DIM],sol[DIM];
inline int f (double n){
    if (n < -EPS || n > EPS)
        return 0;
    return 1;
}
int main (){

    fin>>n>>m;
    for (i=1;i<=m;i++){
        fin>>x>>y>>c;
        dist[x][y] = dist[y][x] = c;
        sum_dist[x] += c, sum_dist[y] += c;
        L[x].push_back(y);
        L[y].push_back(x);
        grad[x]++, grad[y]++;
    }
    /// x[i] - expected time sa ajung din i in n
    /// coeficientii
    for (i=1;i<n;i++){
        /// nodurile care nu sunt vecine cu i au coef 0
        for (auto vecin : L[i])
            a[i][vecin] += 1.0;
        a[i][i] = -1.0*grad[i];
        a[i][n+1] = -1.0*sum_dist[i]; /// termenul liber e suma dist
    }
    //a[n][n] = 1.0;

    int i = 1, j = 1;
    while (i <= n && j <= n){
        int lin = i;
        while (lin <= n && a[lin][j] == 0)
            lin++;
        if (lin == n+1){
            j++;
            continue;
        }
        if (lin != i){
            for (int col=1;col<=n+1;col++)
                swap (a[lin][col],a[i][col]);
        }
        for (int k=j+1;k<=n+1;k++)
            a[i][k] /= a[i][j];
        a[i][j] = 1;

        for (int k=i+1;k<=n;k++){
            for (int t=j+1;t<=n+1;t++)
                a[k][t] = a[k][t] - a[i][t]*a[k][j];
            a[k][j] = 0;
        }
        i++, j++;
    }

    for (i=n;i>=1;i--){
        j = 1;
        while (j <= n+1 && f(a[i][j]))
            j++;
        if (j == n+2)
            continue;
        sol[j] = a[i][n+1];
        for (int k=j+1;k<=n+1;k++)
            sol[j] -= a[i][k]*sol[k];
    }

    fout<<setprecision(5)<<fixed<<sol[1]<<"\n";

    return 0;
}