Cod sursa(job #1473262)

Utilizator tamionvTamio Vesa Nakajima tamionv Data 18 august 2015 22:16:36
Problema Tunelul groazei Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.15 kb
#include <fstream>
#include <iostream>
#include <vector>
#include <algorithm>
#include <iomanip>
#include <functional>
using namespace std;
using namespace std::placeholders;

constexpr int precision = 4;

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[n-1][n-1] = 1;
	// sistem[n-1][n] = 0
	for(int i = 0, a, b, c; i < m; ++i){
		f >> a >> b >> c;
		--a, --b;
		for(int i = 0, surs = a, dest = b; i < 2; ++i, swap(surs, dest)){
			if(surs != n-1){
				++sistem[surs][surs];
				--sistem[surs][dest];
				sistem[surs][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]); });
			const int next_ec = distance(begin(sistem), it);
			if(next_ec >= n_ec){
				continue; }
			else if(ec_cur != next_ec){
				swap(sistem[ec_cur], sistem[next_ec]); } }

		{
			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));
	/*
	for(const auto& x : sistem){
		for(const auto y : x){
			cout << y << ' '; }
		cout << '\n'; }
	*/
	rezolva_sistem(sistem);

	g << fixed << setprecision(10);
	g << sistem.front().back();
	return 0; }