Cod sursa(job #716980)

Utilizator mihaipopa12Popa Mihai mihaipopa12 Data 19 martie 2012 14:35:47
Problema Flux Scor 88
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.61 kb
#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 != 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 ; ++j ){
			if ( !iszero(A[i][j]) ){
				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;
}