Pagini recente » Cod sursa (job #267339) | Cod sursa (job #36106) | Cod sursa (job #18573) | Cod sursa (job #18336) | Cod sursa (job #110050)
Cod sursa(job #110050)
#include <stdio.h>
#include <vector>
#include <set>
using namespace std;
#define NMAX 256
#define TMAX 1024
#define TMAX_M1 1023
#define eps 0.0000005
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;
}