Cod sursa(job #351832)

Utilizator andrei-alphaAndrei-Bogdan Antonescu andrei-alpha Data 29 septembrie 2009 16:45:51
Problema Tunelul groazei Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.06 kb
using namespace std;

#include <vector>
#include <cstdio>
#define FOR(i,a,b) for(int i=a;i<=b;++i)

vector< vector< pair<int,int> > > A;
double C[270][270];
int N,M;

void scan()
{
	freopen("tunel.in","r",stdin);
	freopen("tunel.out","w",stdout);
	
	scanf("%d%d",&N,&M);
	A.resize(N+1);
	
	int x,y,c;
	FOR(i,1,M)
	{
		scanf("%d%d%d",&x,&y,&c);
		A[x].push_back( make_pair(y,c) );
		A[y].push_back( make_pair(x,c) );
	}
}

void Build_system()
{
	FOR(i,1,N-1)
	for(vector< pair<int,int> >::iterator it = A[i].begin();it != A[i].end();++it )
		C[i][it->first] = (double)1 / (double)(A[i].size() ),
		C[i][0] += (double)it->second / (double)(A[i].size() );
	--N;	
}

void Gauss() 
{
	for(int i = N;i > 1;--i)
	{
		FOR(j,0,N) 
			C[i][j] *= 1.0 / (1.0 - C[i][i]);
		C[i][i] = 0;
		
		FOR(j,1,N)
		{
			FOR(k,0,N)
				C[j][k] += C[i][k] * C[j][i];
			C[j][i] = 0;	
		}	
	}
	
	printf("%lf\n",(1.0 / (1.0 - C[1][1]) ) * C[1][0]);
}

void solve()
{
	Build_system();
	Gauss();
}

int main()
{
	scan();
	
	solve();
	return 0;
}