Mai intai trebuie sa te autentifici.
Cod sursa(job #741865)
Utilizator | Data | 27 aprilie 2012 11:31:05 | |
---|---|---|---|
Problema | Flux | Scor | 80 |
Compilator | cpp | Status | done |
Runda | Arhiva de probleme | Marime | 1.58 kb |
#include <cstdio>
#include <cassert>
#include <vector>
using namespace std;
struct Edge {
int x, y, c;
Edge(int _x, int _y, int _c) {
x = _x; y = _y; c = _c;
}
};
const int kMaxN = 105;
vector <Edge> v;
int N;
double gauss[kMaxN][kMaxN], init[kMaxN];
void read() {
int M, x, y, c;
assert(scanf("%d%d", &N, &M));
for (int i = 0; i < M; ++i) {
assert(scanf("%d%d%d", &x, &y, &c));
v.push_back(Edge(x, y, c));
}
}
void initGauss() {
for (int i = 0; i < (int)v.size(); ++i) {
++gauss[v[i].x][v[i].x]; --gauss[v[i].x][v[i].y];
++gauss[v[i].y][v[i].y]; --gauss[v[i].y][v[i].x];
}
for (int i = 0; i <= N; ++i)
gauss[1][i] = 0;
gauss[1][1] = 1;
gauss[N][0] = 1;
}
void _Gauss() {
for (int j = 1; j <= N; ++j) {
int i = 0;
for (i = j; i <= N; ++i)
if (gauss[i][j])
break;
if (i != j)
swap(gauss[i], gauss[j]);
for (i = 1; i <= N; ++i)
if (i != j) {
double x = - gauss[i][j] / gauss[j][j];
for (int k = 0; k <= N; ++k)
gauss[i][k] += x * gauss[j][k];
}
}
for (int i = 1; i <= N; ++i)
init[i] = gauss[i][0] / gauss[i][i];
}
inline double modul(double x) {
return x < 0 ? (-x) : x;
}
void solve() {
double coef = (1LL << 60);
for (int i = 0; i < (int)v.size(); ++i) {
double cc = v[i].c / modul(init[v[i].x] - init[v[i].y]);
if (cc < coef)
coef = cc;
}
printf("%lf\n", coef);
}
int main() {
assert(freopen("flux.in", "r", stdin));
assert(freopen("flux.out", "w", stdout));
read();
initGauss();
_Gauss();
solve();
return 0;
}