Cod sursa(job #919413)

Utilizator apopeid13Apopeid Alejandro apopeid13 Data 19 martie 2013 17:16:29
Problema Tunelul groazei Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.05 kb
#include <fstream>
#include <iomanip>
#include <algorithm>
#include <vector>
 
using namespace std;
 
const double eps = 0.0001;
 
int N, M;
vector<pair<int, int> > V[260];
double A[260][260], X[260];
 
int main()
{
    ifstream fin("tunel.in");
    ofstream fout("tunel.out");
 
    fin >> N >> M;
    for (int i = 1, nod1, nod2, cost; i <= M; ++i)
    {
        fin >> nod1 >> nod2 >> cost;
        V[nod1].push_back(make_pair(nod2, cost));
        V[nod2].push_back(make_pair(nod1, cost));
    }
 
    for (int i = 1; i <= N; ++i)
    {
        A[i][i] -= 1.0;
        if (i == N) continue;
 
        int grad = V[i].size(), sumdist = 0;
        for (vector<pair<int, int> >::iterator it = V[i].begin(); it != V[i].end(); ++it)
        {
            sumdist += it->second;
            A[i][it->first] += 1.0 / grad;
        }
 
        A[i][N + 1] -= 1.0 * sumdist / grad;
    }
 
    for (int i = 1, j = 1; i <= N && j <= N; ++i)
    {
        int findnow = 0;
        for (findnow = i; findnow <= N && A[i][j] == 0; ++findnow);
 
        if (findnow == N + 1)
        {
            --i;
            ++j;
            continue;
        }
 
        for (int k = 1; k <= N + 1; ++k)
            swap(A[i][k], A[findnow][k]);
 
        double rednow = A[i][j];
        for (int k = 1; k <= N + 1; ++k)
            A[i][k] /= rednow;
 
        for (int k = i + 1; k <= N; ++k)
        {
            rednow = A[k][j];
            for (int l = 1; l <= N + 1; ++l)
                A[k][l] -= A[i][l] * rednow;
        }
 
        ++j;
    }
 
    for (int i = N; i >= 1; --i)
        for (int j = 1; j <= N + 1; ++j)
            if (A[i][j] < -eps || A[i][j] > eps)
            {
                X[j] = A[i][N + 1];
                for (int k = i - 1; k >= 1; --k)
                {
                    A[k][N + 1] -= X[j] * A[k][j];
                    A[k][j] = 0;
                }
                break;
            }
 
    fout << fixed << setprecision(6) << X[1] << '\n';
 
    fin.close();
    fout.close();
}