Cod sursa(job #121694)

Utilizator sims_glAlexandru Simion sims_gl Data 9 ianuarie 2008 15:12:22
Problema Tunelul groazei Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.43 kb
#include <stdio.h>

#define nm 256
#define eps 1e-10

int n, m, mat[nm][nm], g[nm];
double p[nm][nm], r[nm];

double abs(double val)
{
	if (val < 0)
		return -val;
	return val;
}

int main()
{
	freopen("tunel.in", "r", stdin);
	freopen("tunel.out", "w", stdout);

	scanf("%d%d", &n, &m);

	for (int i = 1; i <= m; ++i) {
		int x, y, c;

		scanf("%d%d%d", &x, &y, &c);

		g[x]++; g[y]++;

		mat[x][y] += c;
		p[x][y]++;

		mat[y][x] += c;
		p[y][x]++;
	}

	--n;

	for (int i = 1; i <= n; ++i) {
		for (int j = 1; j <= n + 1; ++j)
			if (i != j) {
				r[i] += mat[i][j];
				p[i][j] = -p[i][j];
			}

		p[i][i] = g[i];
	}

	/*for (int i = 1; i <= n; ++i) {
		for (int j = 1; j <= n; ++j)
			printf("%.3lf ", p[i][j]);
		printf("%.3lf\n", r[i]);
	}*/

	for (int i = 1; i <= n; ++i) {
		if (p[i][i] == 0) {
			for (int j = i + 1; j <= n; ++j)
				if (p[j][i]) {
					double aux;

					for (int k = 1; k <= n; ++k) {
						aux = p[i][k];
						p[i][k] = p[j][k];
						p[j][k] = aux;
					}

					aux = r[i];
					r[i] = r[j];
					r[j] = aux;
				}
		}

		for (int j = 1; j <= n; ++j)
			if (i != j && abs(p[j][i]) > eps) {
				double x = p[i][i] / p[j][i];
				for (int k = 1; k <= n; ++k)
					p[j][k] = p[j][k] * x - p[i][k];
				

				r[j] = r[j] * x - r[i];
			}

		/*printf("\n");
		for (int j = 1; j <= n; ++j) {
			for (int k = 1; k <= n; ++k)
				printf("%.3lf ", p[j][k]);
			printf("%.3lf\n", r[j]);
		}*/
	}

	printf("%.4lf\n", r[1] / p[1][1]);

	return 0;
}