Cod sursa(job #1471479)

Utilizator tamionvTamio Vesa Nakajima tamionv Data 14 august 2015 07:15:33
Problema Tunelul groazei Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.88 kb
#include <fstream>
#include <vector>
#include <algorithm>
#include <iomanip>
#include <functional>
using namespace std;
using namespace std::placeholders;

constexpr int precision = 7;

vector<vector<double> > citeste_sistem(ifstream& f){
	vector<vector<double> > sistem;
	int n, m;
	f >> n >> m;
	sistem.resize(n, vector<double>(n+1, 0));
	sistem[0][0] = 1;
	for(int i = 0, a, b; i < m; ++i){
		double c;
		f >> a >> b >> c;
		--a, --b;
		if(b != n-1){
			++sistem[a][a];
			--sistem[a][b];
			sistem[a][n] += c; }

		if(a != n-1){
			++sistem[b][b];
			--sistem[b][a];
			sistem[b][n] += c; } }
	return sistem; }

constexpr bool e_zero(const double d){
	return -1e-7 < d && d < 1e-7; }

void rezolva_sistem(vector<vector<double> >& sistem){
	const int n_ec = sistem.size(), n_var = sistem.front().size()-1;

	for(int var_de_rez = 0, ec_cur = 0;
		var_de_rez < n_var && ec_cur < n_ec;
		++var_de_rez, ++ec_cur){

		{
			auto it = find_if(begin(sistem)+ec_cur, end(sistem),
				[var_de_rez](const vector<double>& ec){
					return !e_zero(ec[var_de_rez]); });
			ec_cur = distance(begin(sistem), it);
			if(ec_cur >= n_ec){
				continue; } }

		{
			const double factor = sistem[ec_cur][var_de_rez];
			transform(begin(sistem[ec_cur])+var_de_rez, end(sistem[ec_cur]),
				begin(sistem[ec_cur])+var_de_rez, bind(divides<double>(), _1, factor)); }

		for(int ec_sec = 0; ec_sec < n_ec; ++ec_sec){
			if(ec_sec != ec_cur){
				const double factor = sistem[ec_sec][var_de_rez];
				transform(begin(sistem[ec_sec])+var_de_rez, end(sistem[ec_sec]),
					begin(sistem[ec_cur])+var_de_rez,
					begin(sistem[ec_sec])+var_de_rez,
					[factor](const double din_ec_sec, const double din_ec_cur){
						return din_ec_sec - factor * din_ec_cur; }); } } } }
int main(){
	ifstream f("tunel.in");
	ofstream g("tunel.out");

	vector<vector<double> > sistem(citeste_sistem(f));
	rezolva_sistem(sistem);
	g << sistem.back().back();
	return 0; }