Cod sursa(job #110049)

Utilizator mugurelionutMugurel-Ionut Andreica mugurelionut Data 25 noiembrie 2007 16:47:15
Problema Tunelul groazei Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.98 kb
#include <stdio.h>

#include <vector>
#include <set>
using namespace std;

#define NMAX 256
#define TMAX 1024
#define TMAX_M1 1023
#define eps 0.000005

vector<pair<int, int> > v[NMAX];
vector<int> event[TMAX];
int deg[NMAX];
char inq[NMAX][TMAX];
long double prob[NMAX], preach[NMAX][TMAX], p, nextp, expected_time;
int i, j, k, d, q, vec, dvec, N, M, T, t, lastok;

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

	scanf("%d %d", &N, &M);

	for (i = 1; i <= N; i++)
	{
		v[i].clear();
		deg[i] = deg[j] = 0;
	}

	while (M--)
	{
		scanf("%d %d %d", &i, &j, &k);
		v[i].push_back(make_pair(j, k));
		v[j].push_back(make_pair(i, k));

		deg[i]++;
		deg[j]++;
	}

	for (i = 1; i <= N; i++)
		if (deg[i] > 0)
			prob[i] = 1.0 / ((long double)(deg[i]));
		else
			deg[i] = 0;

	// simulate !

	expected_time = 0.0;

	for (T = 0; T < TMAX; T++)
		event[T].clear();

	for (i = 1; i <= N; i++)
		for (t = 0; t < TMAX; t++)
			preach[i][t] = 0.0,
			inq[i][t] = 0;

	inq[1][0] = 1;
	preach[1][0] = 1.0;
	event[0].push_back(1.0);

	lastok = 0;

	for (T = 0; T - lastok < TMAX; T++)
	{
		t = T & TMAX_M1;

		if (event[t].size() > 0)
			lastok = T;

		for (k = 0; k < event[t].size(); k++)
		{
			i = event[t][k];
			p = preach[i][t];
			preach[i][t] = 0.0;
			nextp = p * prob[i];

			for (q = 0; q < v[i].size(); q++)
			{
				vec = v[i][q].first;
				dvec = v[i][q].second + T;

				if (vec == N)
				{
					expected_time += nextp * dvec;
				}
				else
				if (nextp * dvec > eps)
				{
					dvec &= TMAX_M1;

					if (!inq[vec][dvec])
					{
						event[dvec].push_back(vec);
						preach[vec][dvec] = nextp;
						inq[vec][dvec] = 1;
					}
					else
						preach[vec][dvec] += nextp;
				}
			}

			inq[i][t] = 0;
		}

		event[t].clear();

		/*
		if (T % 10 == 0)
			fprintf(stderr, "T=%d: %.5Lf\n", T, expected_time);
		*/
	}

	freopen("tunel.out", "w", stdout);
	printf("%.5Lf\n", expected_time);

	return 0;
}