Pagini recente » Cod sursa (job #1028179) | Cod sursa (job #2948013) | Cod sursa (job #361581) | Cod sursa (job #2416171) | Cod sursa (job #2430380)
#include <iostream>
#include <fstream>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <cstring>
#include <string>
#include <cmath>
#include <iomanip>
using namespace std;
FILE *in, *out;
const long double EPS = 0.0000001;
int main() {
in = fopen("tunel.in", "r");
out = fopen("tunel.out", "w");
int n, m;
fscanf(in, "%d %d", &n, &m);
vector<vector<double>> v(n + 1, vector<double> (n + 2, 0));
vector<vector<pair<int, int>>> g(n + 1);
for(int i = 1; i <= m; i ++) {
int a, b, c;
fscanf(in,"%d %d %d", &a, &b, &c);
g[a].push_back({b, c});
g[b].push_back({a, c});
}
v[n][n] = 1;
for(int i = 1; i < n; i ++) {
v[i][i] = g[i].size();
for(auto it : g[i]) {
v[i][it.first] --;
v[i][n + 1] += it.second;
}
}
int i = 1, j = 1;
while(i <= n && j <= n) {
int k;
for(k = i; k <= n; k ++)
if(v[k][j] < -EPS || v[k][j] > EPS)
break;
// j este variabila libera
if(k == n + 1) {
j ++;
continue;
}
if(k != i)
swap(v[i], v[k]);
for(int l = j + 1; l <= n + 1; l ++)
v[i][l] /= v[i][j];
v[i][j] = 1;
for(int u = i + 1; u <= n; u ++) {
for(int l = j + 1; l <= n + 1; l ++)
v[u][l] -= (v[u][j] * v[i][l]);
v[u][j] = 0;
}
i ++;
j ++;
}
vector<double> x(n + 1, 0);
for(int i = n - 1; i >= 1; i --) {
for(int j = 1; j <= n + 1; j ++) {
if(v[i][j] > EPS || v[i][j] < -EPS) {
x[j] = v[i][n + 1];
for(int k = j + 1; k <= n; k ++)
x[j] -= (x[k] * v[i][k]);
break;
}
}
}
fprintf(out, "%.8f", x[1]);
return 0;
}