Cod sursa(job #124607)

Utilizator azotlichidAdrian Vladu azotlichid Data 19 ianuarie 2008 17:31:04
Problema Tunelul groazei Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.94 kb
#include <algorithm>
#include <iostream>
#include <iterator>
#include <list>
#include <map>
#include <queue>
#include <set>
#include <sstream>
#include <string>
#include <vector>
#include <cassert>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cctype>
#include <cstring>
using namespace std;

#define ALL(x) (x).begin(), (x).end()
#define CLEAR(X) (memset(X, 0, sizeof(X)))
#define FORI(it, x) for (__typeof((x).begin()) it = (x).begin(); it != (x).end(); ++it)
#define FOR(i, N, M) for (int i = (int)(N); i <= (int)(M); ++i)
#define REP(i, N) for (int i = 0; i < (int)(N); ++i)
#define SIZE(X) (int)((X).size())
#define TIPA(a, i) (cerr << #a << "[" #i " = " << (i) << "] = " << (a)[i] << endl)
#define TIP(x) (cerr << #x << " = " << (x) << endl)

#define MP make_pair
#define PB push_back
#define INF 0x3F3F3F3F

typedef long long LL;

#define NMAX 256

double a[NMAX][NMAX], b[NMAX], r[NMAX];
vector<pair<int, int> > adj[NMAX];
int N, M, x, y, z;

int main(void)
{
    freopen("tunel.in", "r", stdin);
    freopen("tunel.out", "w", stdout);
	scanf("%d %d", &N, &M);
	REP(k, M)
	{
		scanf("%d %d %d", &x, &y, &z);
		adj[x].PB(MP(y, z));
		adj[y].PB(MP(x, z));
	}

	memset(a, 0, sizeof(a));
	FOR(i, 1, N-1)
	{
		a[i][i] = adj[i].size();
		FORI(it, adj[i])
        {
			if (it->first != N)
				a[i][it->first] -= 1;
            a[i][N] += it->second;
        }
	}

	FOR(i, 1, N-1)
	{
		//caut linie cu a[k][i] != 0
		FOR(k, i, N-1) if (a[k][i] != 0)
		{
			FOR(j, 1, N) swap(a[i][j], a[k][j]);
			break;
		}

		FOR(k, i+1, N-1) if (a[k][i] != 0)
		{
			double v = -a[k][i] / a[i][i];
			FOR(j, 1, N) a[k][j] += v * a[i][j]; 
		}
	}

    r[N-1] = a[N-1][N] / a[N-1][N-1];
    for (int i = N-2; i >= 1; i--)
    {
        for (int j = i+1; j <= N-1; j++)
            a[i][N] -= r[j]*a[i][j];
        r[i] = a[i][N] / a[i][i];
    }

    printf("%0.3lf\n", r[1]);
    return 0;
}