Pagini recente » Cod sursa (job #2118040) | Cod sursa (job #1153525) | Cod sursa (job #1471479)
#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; }