Cod sursa(job #818628)

Utilizator rvnzphrvnzph rvnzph Data 17 noiembrie 2012 19:16:44
Problema Tunelul groazei Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.41 kb
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <iomanip>
#include <vector>
#include <stdlib.h>

#define NLen 256
#define EPS 0.001

using namespace std;

vector <int> g[NLen];

int num_edge[NLen][NLen];
int cost[NLen][NLen];
double E[NLen][NLen];

int grad[NLen];
int tm[NLen];

int N;

inline void make_system()
{
	for(int nod=1;nod<N;++nod)
	{
		E[nod][nod]=grad[nod];
		for(int adj=0;adj<g[nod].size();++adj)
		{
			if(g[nod][adj]!=N) E[nod][g[nod][adj]]-=num_edge[nod][g[nod][adj]];
			E[nod][0]+=cost[nod][g[nod][adj]];
		}
	}
}

inline void do_gauss()
{
	for(int i=1;i<N;++i)
	{
		if(E[i][i]!=1)
		{
			E[i][0]/=E[i][i];
			for(int j=i+1;j<N;++j) E[i][j]/=E[i][i];
			E[i][i]=1;
		}
		
		for(int r=i+1;r<N;++r)
			if(abs(E[r][i])>EPS)
			{
				for(int c=i+1;c<N;++c)
					E[r][c]-=E[r][i]*E[i][c];
				E[r][0]-=E[r][i]*E[i][0];
				E[r][i]=0;
			}
	}
}

inline void solve_system()
{
	for(int i=N-1;i>0;--i)
	{
		tm[i]=E[i][0];
		
		for(int j=i+1;j<N;++j)
			tm[i]-=tm[j]*E[i][j];
	}
}

int main()
{
	freopen("tunel.in","r",stdin);
	freopen("tunel.out","w",stdout);
	
	int M;
	
	cin>>N>>M;
	
	int x,y,c;
	
	for(int i=1;i<=M;++i)
	{
		cin>>x>>y>>c;
		
		g[x].push_back(y);
		g[y].push_back(x);
		
		cost[x][y]=c;
		cost[y][x]=c;
		
		++num_edge[x][y];
		++num_edge[y][x];
		
		++grad[x];
		++grad[y];
	}
	
	make_system();
	do_gauss();
	solve_system();
	
	cout<<fixed<<setprecision(3);
	cout<<tm[1]<<'\n';
	
	return 0;
}