Cod sursa(job #1756080)

Utilizator Cristian1997Vintur Cristian Cristian1997 Data 11 septembrie 2016 20:13:53
Problema Tunelul groazei Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.42 kb
#include <fstream>
#include <iomanip>
#include <vector>
#include <algorithm>
#include <string>
#include <cstring>
using namespace std;
using ll = long long;
using uint = unsigned int;
using ull = unsigned long long;
using pii = pair<int, int>;
using pll = pair<ll, ll>;
#define NMAX 260
#define EPS 0.000001

int deg[NMAX];
double v[NMAX][NMAX], x[NMAX];

int main()
{
	int i, j, k, l, n, m, a, b, c;
	ifstream fin("tunel.in");
	ofstream fout("tunel.out");

	fin >> n;
	for (fin >> m; m; --m)
	{
		fin >> a >> b >> c;

		++v[a][b]; ++deg[a]; v[a][n + 1] -= c;
		++v[b][a]; ++deg[b]; v[b][n + 1] -= c;
	}

	for (i = 1; i <= n; ++i) v[i][i] = -deg[i];

	for (i = j = 1; i < n && j <= n; )
	{
		for (k = i; k < n; ++k)
			if (v[k][j] < -EPS || v[k][j] > EPS) break;

		if (k >= n) { ++j; continue; }
		if (k != i) for (l = j; l <= n + 1; ++l) swap(v[k][l], v[i][l]);

		for (l = j + 1; l <= n + 1; ++l) v[i][l] /= v[i][j]; v[i][j] = 1;
		for (k = i + 1; k < n; ++k)
		{
			for (l = j + 1; l <= n + 1; ++l) v[k][l] -= v[i][l] * v[k][j];
			v[k][j] = 0;
		}

		++i; ++j;
	}

	for (i = n - 1; i >= 1; --i)
	{
		for (j = 1; j <= n; ++j)
			if (v[i][j] < -EPS || v[i][j] > EPS) break;

		if (j <= n)
		{
			x[j] = v[i][n + 1];
			for (l = j + 1; l <= n; ++l) x[j] -= x[l] * v[i][l];
		}
	}

	fout << fixed << setprecision(7) << x[1] << '\n';

	fin.close();
	fout.close();

	return 0;
}