Cod sursa(job #672903)

Utilizator mihaipopa12Popa Mihai mihaipopa12 Data 3 februarie 2012 13:35:02
Problema Tunelul groazei Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.81 kb
#include<stdio.h>

#define maxn 259

FILE*f=fopen("tunel.in","r");
FILE*g=fopen("tunel.out","w");

int n,m,i,j,k,index,a,b,c;
int gr[maxn];
double A[maxn][maxn],res[maxn];

inline void sisteme () {
	
	fscanf(f,"%d %d",&n,&m);
	
	for ( i = 1 ; i <= m ; ++i ){
		fscanf(f,"%d %d %d",&a,&b,&c);
		++gr[a]; ++gr[b];
		++A[a][b]; ++A[b][a]; A[a][n+1] -= c; A[b][n+1] -= c;
	}
	
	for ( i = 1 ; i <= n ; ++i ){
		for ( j = 1 ; j <= n + 1 ; ++j ){
			A[i][j] /= gr[i];
		}
		A[i][i] = -1;
	}
	
	for ( i = 1 ; i <= n + 1 ; ++i ){
		A[n][i] = 0;
	}
}

inline bool equal ( double a , double b ){
	double dif = a - b;
	if ( dif < 0 )	dif = -dif;
	
	if ( dif < 1e-5 ){
		return 1;
	}
	
	return 0;
}

inline void swap ( double &a , double &b ){
	double aux = a; a = b; b = aux;
}

inline void rezolva () {
	
	for ( i = 1 , j = 1 ; i <= n && j <= n ; ){
		
		for ( k = i ; k <= n ; ++k ){
			if ( !equal(A[k][j],0.0) ){
				break ;
			}
		}
		
		if ( k == n + 1 ){
			++j;
			continue ;
		}
		
		if ( k != i ){
			for ( index = 1 ; index <= n + 1 ; ++index ){
				swap(A[i][index],A[k][index]);
			}
		}
		
		for ( k = j + 1 ; k <= n + 1 ; ++k ){
			A[i][k] /= A[i][j];
		}
		A[i][j] = 1;
		
		for ( index = i + 1 ; index <= n ; ++index ){
			double x = A[index][j];
			for ( k = j ; k <= n + 1 ; ++k ){
				A[index][k] = A[index][k] - x * A[i][k];
			}
		}
		
		++i; ++j;
	}
	
	for ( index = n - 1 ; index >= 1 ; --index ){
		for ( i = 1 ; i <= n + 1 ; ++i ){
			if ( !equal(A[index][i],0.0) ){
				res[index] = A[index][n+1];
				for ( j = index + 1 ; j <= n ; ++j ){
					res[index] -= res[j] * A[index][j];
				}
				break ;
			}
		}
	}
	
	fprintf(g,"%lf\n",res[1]);
}

int main () {
	
	sisteme();
	
	rezolva();
	
	fclose(f);
	fclose(g);
	
	return 0;
}