Cod sursa(job #419880)

Utilizator GheorgheMihaiMihai Gheorghe GheorgheMihai Data 18 martie 2010 09:37:40
Problema Tunelul groazei Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.89 kb
#include<stdio.h>
#include<vector>
#define mp make_pair
#define pb push_back
#define f first
#define s second
using namespace std;
int n,m,g[260];
vector< pair<int,int> > v[260];
double sol[260][260];

int main()
{
	freopen("tunel.in","r",stdin);
	freopen("tunel.out","w",stdout);
	scanf("%d%d",&n,&m);
	int i,j,k,x,y,z,lim;
	for(i=1;i<=m;i++)
	{
		scanf("%d%d%d",&x,&y,&z);
		v[x].pb(mp(y,z));
		g[x]++;
		v[y].pb(mp(x,z));
		g[y]++;
	}
	for(i=1;i<n;i++)
	{
		lim=v[i].size();
		for(j=0;j<lim;j++)
		{
			sol[i][v[i][j].f]+=1/(double)g[i];
			sol[i][0]+=v[i][j].s/(double)g[i];
		}
	}
	double a,b;
	for(i=2;i<n;i++)
	{
		a=1/(1-sol[i][i]);
		for(j=0;j<n;j++)
			sol[i][j]*=a;
		sol[i][i]=0;
		for(j=1;j<n;j++)
		{
			b=sol[j][i];
			for(k=0;k<n;k++)
				sol[j][k]+=sol[i][k]*b;
			sol[j][i]=0;
		}
	}
	printf("%lf",sol[1][0]/(1-sol[1][1]));
	return 0;
}