Cod sursa(job #109863)

Utilizator victorsbVictor Rusu victorsb Data 25 noiembrie 2007 12:51:22
Problema Tunelul groazei Scor 20
Compilator cpp Status done
Runda preONI 2008, Runda 1, Clasele 11-12 Marime 0.97 kb
#include <cstdio>
#include <vector>
#include <algorithm>

using namespace std;

#define Nmax 256
#define Tmax 4096
#define pb push_back
#define sz(a) (int)((a).size())
#define mp make_pair
#define x first
#define y second

const double eps = 10e-8;

int n, m;
vector<pair<int, int> > lv[Nmax];
double d[Tmax][Nmax], sol, done;
int gr[Nmax];

void citire()
{
	int i, a, b, c;

	scanf("%d %d\n", &n, &m);
	for (i = 1; i <= m; ++i)
	{
		scanf("%d %d %d\n", &a, &b, &c);
		lv[a].pb(mp(b, c));
		lv[b].pb(mp(a, c));
		++gr[a], ++gr[b];
	}
}

void solve()
{
	int i, j, k;

	d[0][1] = 1;
	for (i = 1; done + eps < 1 && i < Tmax; ++i)
	{
		for (j = 1; j <= n; ++j)
			for (k = 0; k < sz(lv[j]); ++k)
				if (lv[j][k].x != n && lv[j][k].y <= i)
					d[i][j] += d[i - lv[j][k].y][lv[j][k].x] / gr[lv[j][k].x];
		done += d[i][n];
		sol += i * d[i][n];
	}

	printf("%lf\n", sol);
}

int main()
{
	freopen("tunel.in", "r", stdin);
	freopen("tunel.out", "w", stdout);

	citire();
	solve();

	return 0;
}