Pagini recente » Cod sursa (job #3168614) | Cod sursa (job #1272748) | Cod sursa (job #543480) | Cod sursa (job #2748632) | Cod sursa (job #716984)
Cod sursa(job #716984)
#include<stdio.h>
#include<vector>
#define maxn 105
#define maxm 5005
using namespace std;
FILE*f=fopen("flux.in","r");
FILE*g=fopen("flux.out","w");
const double eps = 1e-12;
int n,m,conex;
int viz[maxn];
double A[maxn][maxn],X[maxn];
vector<int>G[maxn];
struct mch{
int x,y;
int c;
}M[maxm];
inline void citire () {
fscanf(f,"%d %d",&n,&m);
for ( int i = 1 ; i <= m ; ++i ){
fscanf(f,"%d %d %d",&M[i].x,&M[i].y,&M[i].c);
G[M[i].x].push_back(M[i].y);
G[M[i].y].push_back(M[i].x);
}
}
void dfs ( int nod ){
viz[nod] = 1;
for ( vector<int>::iterator itt = G[nod].begin() ; itt != G[nod].end() ; ++itt ){
int nodvcn = (*itt);
if ( !viz[nodvcn] ){
dfs(nodvcn);
}
}
}
inline void build () {
dfs(1);
if ( viz[n] ) conex = 1;
else return ;
for ( int i = 1 ; i <= m ; ++i ){
int x = M[i].x;
int y = M[i].y;
++A[x][x]; --A[x][y];
++A[y][y]; --A[y][x];
}
for ( int i = 2 ; i <= n ; ++i ){
A[1][i] = 0;
}
A[1][1] = 1; A[1][n+1] = 0;
A[n][n+1] = 1;
}
inline double abs ( double j ){
if ( j < 0 )
return -j;
return j;
}
inline bool iszero ( double x ){
if ( abs(x) < eps )
return 1;
return 0;
}
inline void swap_lines ( int i , int j ){
for ( int k = 1 ; k <= n + 1 ; ++k ){
double aux = A[i][k]; A[i][k] = A[j][k]; A[j][k] = aux;
}
}
inline void gauss () {
int i,j,index,k;
i = 1; j = 1;
while ( i <= n && j <= n ){
for ( index = i ; index <= n ; ++index ){
if ( !iszero(A[index][j]) ){
break ;
}
}
if ( index == n + 1 ){
++j;
continue ;
}
if ( index != i ){
swap_lines(i,index);
}
for ( index = j + 1 ; index <= n + 1 ; ++index ){
A[i][index] = A[i][index] / A[i][j];
}
A[i][j] = 1;
for ( k = i + 1 ; k <= n ; ++k ){
double x = A[k][j];
for ( index = 1 ; index <= n + 1 ; ++index ){
A[k][index] = A[i][index] * x - A[k][index];
}
}
++i; ++j;
}
for ( i = n ; i >= 1 ; --i ){
for ( j = 1 ; j <= n + 1 ; ++j ){
if ( !iszero(A[i][j]) ){
if ( j == n + 1 ){
conex = 0;
return ;
}
X[j] = A[i][n+1];
for ( k = j + 1 ; k <= n ; ++k ){
X[j] -= X[k] * A[i][k];
}
break ;
}
}
}
}
inline void solve () {
if ( !conex ){
fprintf(g,"%.3lf\n",0);
return ;
}
double sol = 1LL<<62;
for ( int i = 1 ; i <= m ; ++i ){
int x = M[i].x; int y = M[i].y; int c = M[i].c;
double flux,raport;
flux = abs(X[x] - X[y]);
raport = c / flux;
if ( raport < sol ) sol = raport;
}
fprintf(g,"%.3lf\n",sol);
}
int main () {
citire();
build();
if ( conex ){
gauss();
}
solve();
fclose(f);
fclose(g);
return 0;
}