Pagini recente » Cod sursa (job #19252) | Cod sursa (job #2913106) | Cod sursa (job #1441958) | Cod sursa (job #2875409) | Cod sursa (job #2145348)
#include <bits/stdc++.h>
#define MAXN 200
int n, m;
std::vector <std::pair<int, double>> G[1 + MAXN];
const double EPS = 0.0000001;
inline double absolut(double a){return a > 0 ? a : -a;}
double a[1 + MAXN][1 + MAXN + 1], v[1 + MAXN];
bool seen[1 + MAXN];
void dfs(int node){
for(auto i: G[node]) if(!seen[i.first]) seen[i.first] = 1, dfs(i.first);
}
int main(){
FILE*fi,*fo;
fi = fopen("flux.in","r");
fo = fopen("flux.out","w");
fscanf(fi,"%d%d", &n, &m);
for(int i = 1; i <= m; i++){
int a, b; double c; fscanf(fi,"%d%d%lf", &a, &b, &c);
G[a].push_back({b, c});
G[b].push_back({a, c});
}
seen[1] = 1, dfs(1);
if(!seen[n]){
fprintf(fo,"0.00000");
return 0;
}
a[1][1] = 1, a[1][n + 1] = 0;
for(int i = 2; i <= n; i++)
for(auto j:G[i]) if(j.first != i) a[i][j.first]++, a[i][i]--;
a[n][n + 1] = -1;
m = n;
int i, j, k;
i = j = 1;
while(i <= n && j <= m){
k = i;
while(k <= n && absolut(a[k][j]) < EPS) k++;
if(k != n + 1){
if(k != i) for(int p = 1; p <= m + 1; p++) std::swap(a[i][p], a[k][p]);
for(int p = j + 1; p <= m + 1; p++) a[i][p] /= a[i][j];
a[i][j] = 1.0;
for(int p = i + 1; p <= n; p++){
for(int q = j + 1; q <= m + 1; q++) a[p][q] -= a[p][j] * a[i][q];
a[p][j] = 0.0;
}
i++;
}
j++;
}
for(int i = n; i >= 1; i--)
for(int j = 1; j <= m + 1; j++)
if(absolut(a[i][j]) > EPS){
v[j] = a[i][m + 1];
for(int k = j + 1; k <= m; k++) v[j] -= v[k] * a[i][k];
break;
}
double amp = 1000000000000000.0;
for(int i = 1; i <= n; i++)
for(auto j: G[i])
if(j.first != i && v[j.first] > v[i]) amp = std::min(amp, j.second / (v[j.first] - v[i]));
fprintf(fo,"%f", amp);
return 0;
}