Cod sursa(job #110482)

Utilizator ProstuStefan-Alexandru Filip Prostu Data 26 noiembrie 2007 20:28:48
Problema Tunelul groazei Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.35 kb
#include <cstdio>
#include <cmath>
#include <vector>
#include <algorithm>

using namespace std;

typedef pair<int, int> PII;
#define x first
#define y second
#define PB push_back
#define MP make_pair

const double eps = 1e-8;
const int NMAX = 256;

int N, M;
vector <PII> G[NMAX];
double A[NMAX][NMAX];

void read(void) {
	FILE *fin = fopen("tunel.in", "rt");
	int i, u, v, c;

	fscanf(fin, " %d %d", &N, &M);

	for (i = 0; i < M; ++i) {
		fscanf(fin, " %d %d %d", &u, &v, &c);
		G[u].PB( MP(v, c) );
		G[v].PB( MP(u, c) );
	}

	fclose(fin);
}

void init(void) {
	int i;
	double c;
	vector <PII> :: iterator j;

	for (i = 1; i < N; ++i) {
		c = 1. / G[i].size();
		A[i][i] = -1.;

		for (j = G[i].begin(); j != G[i].end(); ++j) {
			if (j->x != N)
				A[i][j->x] += c;
			A[i][0] -= c * j->y;
		}
	}
}

void gauss(void) { // sort of...
	int i, j, k, poz;
	double c;

	init();

	for (i = N - 1; i > 1; --i) {

		poz = 0;
		for (j = i; j && poz == 0; --j)
			if (fabs(A[j][i]) > eps)
				poz = j;

		if (poz == 0) continue;

		for (j = 0; j <= i; ++j)
			swap(A[poz][j], A[i][j]);

		for (j = 1; j < i; ++j) {
			c = A[j][i] / A[i][i];

			for (k = 0; k < i; ++k)
				A[j][k] -= c * A[i][k];
		}
	}
}

void write(void) {
	FILE *fout = fopen("tunel.out", "wt");

	fprintf(fout, "%lf\n", A[1][0] / A[1][1]);

	fclose(fout);
}

int main(void) {

	read();

	gauss();

	write();

	return 0;
}