Cod sursa(job #1210891)

Utilizator BLz0rDospra Cristian BLz0r Data 21 iulie 2014 15:42:45
Problema Tunelul groazei Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.98 kb
#include <cstdio>
#include <algorithm>
using namespace std;

#define eps 0.000001

FILE *f=fopen("tunel.in","r");
FILE *g=fopen("tunel.out","w");
 
double v[260][260];
 
int main(){
    int n,m,x,y,z,i,j,k,l;
	double p;
    
	fscanf (f,"%d%d",&n,&m);
    
	for (i=1;i<=m;++i){
        fscanf (f,"%d%d%d",&x,&y,&z);
        v[x][x]--;
        v[y][y]--;
        v[x][n+1]+=z;
        v[y][n+1]+=z;
        v[x][y]++;
        v[y][x]++;
	}
	
    for (i=1;i<=n+1;++i) v[n][i]=0;
    v[n][n]=1;
	
    for (i=n,j=n;j>=1;--i,--j){
        for (k=i; k>=1 && v[k][j]<eps && v[k][j]>-eps ;--k);
        if (k<1){
            j--;
            continue;
		}
		
		if (i!=k)
			for (l=1;l<=n+1;++l) swap(v[i][l],v[k][l]);
		
        for (k=i-1;k>=1;--k){
            if(v[k][j]>eps || v[k][j]<-eps){
                p=v[k][j]/v[i][j];
                for(l=1;l<=n+1;++l) v[k][l]-=p*v[i][l];
			}
		}
	}
	
	fprintf (g,"%.8lf",-v[i+1][n+1]/v[i+1][1]);
	
    return 0;
}