LightOJ 1287

到一个点,可以向下走,可以在自己的地方停留5分钟,求期望。

公式不错

f[u]=(5+f[u])/(x+1)+(g[u][vi]+f[vi])/(x+1),1<=i<=x,x为合法的下一个点。。

#include <iostream>
#include <functional>
#include <algorithm>
#include <complex>
#include <cstdlib>
#include <cstring>
#include <fstream>
#include <iomanip>
#include <sstream>
#include <utility>
#include <bitset>
#include <cctype>
#include <cstdio>
#include <limits>
#include <memory>
#include <string>
#include <vector>
#include <cmath>
#include <ctime>
#include <queue>
#include <stack>
#include <list>
#include <map>
#include <set>
using namespace std;
const double eps=1e-9;
double f[15][1<<15];
int vis[15][1<<15];
int g[15][15];
int n,m,INF=1e9;
int dfs(int u,int st)
{
    if (st==(1<<n)-1)
    {
        f[u][st]=0;
        return 1;
    }
    if (vis[u][st]) return f[u][st];
    vis[u][st]=1;
    f[u][st]=5;
    int cnt=0,st0;
    for (int i=0;i<n;i++)
    {
        if (!(st&(1<<i))&&g[u][i]!=INF&&dfs(i,st|(1<<i)))
        {
            int st0=st|(1<<i);
            f[u][st]+=g[i][u]+f[i][st0];
            cnt++;
        }
    }
    if (cnt==0)
    {
        f[u][st]=0;
        return 0;
    }
    f[u][st]/=cnt;
    return 1;
}
int main()
{
    int T,ncas=1;
    scanf ("%d",&T);
    while (T--)
    {
        memset(vis,0,sizeof(vis));
        memset(f,0,sizeof(f));
        for (int i=0;i<15;i++)
            for (int j=0;j<15;j++)
                g[i][j]=INF;
        scanf ("%d%d",&n,&m);
        while (m--)
        {
            int t1,t2,w;
            scanf ("%d%d%d",&t1,&t2,&w);
            g[t1][t2]=w;
            g[t2][t1]=w;
        }
        dfs(0,1);
        printf ("Case %d: %.10f\n",ncas++,f[0][1]);
    }
    return 0;
}

posted on 2016-05-11 15:53  very_czy  阅读(220)  评论(0编辑  收藏  举报

导航