Pagini recente » Cod sursa (job #493589) | Cod sursa (job #1479197) | Cod sursa (job #819166) | Cod sursa (job #819181) | Cod sursa (job #1473262)
#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; }