Cod sursa(job #2479809)

Utilizator Ruxandra985Nanu Ruxandra Laura Ruxandra985 Data 24 octombrie 2019 16:22:44
Problema Tunelul groazei Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.1 kb
#include <fstream>
#include <iomanip>
#include <vector>
#include <algorithm>
#define DIMN 260
#define EPS 0.0000001
using namespace std;
double a[DIMN][DIMN] , dp[DIMN];
vector <pair <int,int> > v[DIMN];
int grad[DIMN];
int main()
{
    ifstream fin ("tunel.in");
    ofstream fout ("tunel.out");
    int n,m,i,x,y,c,k,aux,j,nod,sum,vecin;
    fin>>n>>m;
    for (i=1;i<=m;i++){
        fin>>x>>y>>c;
        v[x].push_back(make_pair(y,c));
        v[y].push_back(make_pair(x,c));
        grad[x]++;
        grad[y]++;
    }
    /// construiesc sistemul
    a[1][1] = 1.0;
    for (nod=2;nod<=n;nod++){
        sum = 0;
        a[nod][nod] = -1.0 * grad[nod];
        for (i=0;i<v[nod].size();i++){
            vecin = v[nod][i].first;
            sum-=v[nod][i].second;
            a[nod][vecin] += 1.0;
        }
        a[nod][n+1] = 1.0 * sum;
    }
    /// solve gauss

    i=j=1;

    while (i<=n && j<=n){
        for (k=i;k<=n;k++){
            if (a[k][j]!=0)
                break;
        }
        if (k>n){ /// variabila libera
            j++;
        }
        else {
            /// interschimb linia i cu k
            for (aux = 1; aux <= n+1; aux++)
                swap(a[i][aux] , a[k][aux]);
            for (aux = j+1 ; aux <= n+1 ; aux++){
                a[i][aux] /= a[i][j];
            }
            a[i][j] = 1.0;

            for (k=i+1;k<=n;k++){
                for (aux=n+1;aux>=j;aux--){
                    a[k][aux] = a[k][aux] - a[k][j] * a[i][aux];
                }
            }
            i++;
            j++;
        }
    }
    /// ai facut sistemul sa devina un triunghi intors

    for (i=n;i;i--){
        for (j=1;j<=n+1;j++){
            if (-EPS > a[i][j] || a[i][j] > EPS) /// daca era intre -EPS , EPS , era 0
                break;
        }
        if (j == n + 2)
            continue; /// dp[i] = variabila libera , sa zicem 0
        dp[j] = a[i][n+1] / a[i][j];
        for (aux=i-1;aux;aux--)
            a[aux][n+1] -= dp[j] * a[aux][j];
    }

    fout << setprecision(5) << fixed << dp[n];
    return 0;
}