前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >LightOj_1287 Where to Run

LightOj_1287 Where to Run

作者头像
熙世
发布2019-07-15 16:23:22
2920
发布2019-07-15 16:23:22
举报
文章被收录于专栏:Code思维奇妙屋

题目链接

题意:

  有n个街口和m条街道, 你后边跟着警察,你需要进行大逃亡(又是大爱的抢银行啊),在每个街口你都有≥1个选择, 

  1)停留在原地5分钟。

  2)如果这个街口可以到xi这个街口, 并且, 通过xi可以遍历完所有未走过的街口,那么就加入选择。

  每个选择都是等概率的。

  求警察抓住你所用时间的期望, 即你无路可走时的时间期望。

思路:

  对于每个点, 先找出所有的选择, 假设有k个选择。

  那么E[i] 表示在街口i时被抓的时间期望。

  则, E[i] = 1 / k * sigma (E[u] + time[i][u]) + 1 / k * (E[i] + 5)。

    化简得:E[i] = (sigma (E[u] + time[i][u]) + 5) / (k - 1)

  用staues表示从i点出发, 到达状态staues所用的期望, 即所经历的点。  

代码:

代码语言:javascript
复制
 1 #include <cmath>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <cstdlib>
 5 #include <ctime>
 6 #include <set>
 7 #include <map>
 8 #include <list>
 9 #include <queue>
10 #include <string>
11 #include <vector>
12 #include <fstream>
13 #include <iterator>
14 #include <iostream>
15 #include <algorithm>
16 using namespace std;
17 #define LL long long
18 #define INF 0x3f3f3f3f
19 #define MOD 1000000007
20 #define eps 1e-7
21 #define MAXN 110
22 #define MAXM 16
23 #define dd cout<<"debug"<<endl
24 #define p(x) printf("%d\n", x)
25 #define pd(x) printf("%.7lf\n", x)
26 #define k(x) printf("Case %d: ", ++x)
27 #define s(x) scanf("%d", &x)
28 #define sd(x) scanf("%lf", &x)
29 #define mes(x, d) memset(x, d, sizeof(x))
30 #define f(i, x) for(i = 0; i < x; i ++)
31 int n, m;
32 int w[MAXN][MAXN];
33 double E[MAXM][1 << MAXM];
34 bool vis[MAXM][1 << MAXM];
35 
36 bool dfs(int staues, int root)
37 {
38     if(staues == (1 << n) - 1)
39     {
40         E[root][staues] = 0;
41         return true;
42     }
43     if(vis[root][staues]) return E[root][staues] > 0;
44     vis[root][staues] = true;
45     E[root][staues] = 5;
46     int cnt = 0, sttemp;
47     int i;
48     f(i, n)
49         if(!(staues & (1 << i)) && w[root][i] != INF && dfs((staues | (1 << i)), i))
50         {
51             sttemp = staues | (1 << i);
52             cnt ++;
53             E[root][staues] += w[root][i] + E[i][sttemp];
54         }
55     if(!cnt)
56     {
57         E[root][staues] = 0;
58         return false;
59     }
60     E[root][staues] /= cnt;
61     return true;
62 }
63 
64 int main()
65 {
66     int T;
67     int kcase = 0;
68     s(T);
69     while(T --)
70     {
71         int u, v;
72         int ww;
73         s(n), s(m);
74         mes(w, 0x3f);
75         mes(vis, false);
76         int i;
77         f(i, m)
78         {
79             s(u), s(v), s(ww);
80             w[u][v] = w[v][u] = ww;
81         }
82         dfs(1, 0);
83         k(kcase), pd(E[0][1]);
84     }
85     return 0;
86 }
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2015-08-13 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档