Nu aveti permisiuni pentru a descarca fisierul grader_test20.in

Cod sursa(job #351843)

Utilizator andrei-alphaAndrei-Bogdan Antonescu andrei-alpha Data 29 septembrie 2009 17:24:11
Problema Tunelul groazei Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.08 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(i,2,N)
	{
		double rep = 1.0 / (1.0 - C[i][i]);
		FOR(j,0,N) C[i][j] *= rep;
		C[i][i] = 0;
		
		FOR(j,1,N)
		{
			double rep = C[j][i];
			FOR(k,0,N)
				C[j][k] += C[i][k] * rep;
			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;
}