Uva 11600 期望DP

题意:n个城市,相互可达(有n(n-1)/2条边),其中有一些道路上面有妖怪,现在,从1号城市出发,随机挑取一个城市走去,这个道路上的妖怪就会被消灭,求:

在平均情况下,需要走多少步,使得任意两个城市之间,可以不经过妖怪而相互可达;

(n<=30)

分析:

1、根据题意可知,我们要将每一个可以不经过妖怪的一个个连通分量找出来;

2、然后从一个连通分量走到另一个连通分量,这时肯定进过妖怪;

3、一个一个连通分量,完成了哪几个连通分量,需要保存,这时,就用集合的方式保存;

4、从一个连通分量,走到另一个连通分量,其概率 n-con/(n-1) ,那么平均要走 n-1 / (n-con) 次;

5、状态转移,下一个状态s|(i<<n),和走向这个状态的概率;

#include <bits/stdc++.h>

using namespace std;

int n,m;
vector<int> g[35];
int cnt;
int num[35];
bool vis[35];

int dfs(int u) {
    int count = 1;
    vis[u] = 1;
    for(int i=0;i<g[u].size();i++) {
        int v = g[u][i];
        if(!vis[v])
            count+=dfs(v);
    }
    return count;
}

map<int,double> f;

double dp(int s) {
    if(f[s]>1e-9)
        return f[s];

    int con = 0;
    for(int i=0;i<cnt;i++)
        if(s&(1<<i))
            con+=num[i];
    if(con==n)
        return f[s] = 0;

    f[s] = (n-1)*1.0/(n-con);
    for(int i=0;i<cnt;i++) {
        if(!(s&(1<<i)))
            f[s] +=dp(s|(1<<i))*num[i]*1.0/(n-con);
    }
    return f[s];
}

int main()
{
    int t;
    scanf("%d",&t);
    int kase = 0;
    while(t--) {

        scanf("%d%d",&n,&m);

        f.clear();
        for(int i=0;i<=n;i++)
            g[i].clear();
        cnt = 0;
        memset(vis,0,sizeof(vis));
        memset(num,0,sizeof(num));

        int u,v;
        for(int i=0;i<m;i++) {
            scanf("%d%d",&u,&v);
            g[u].push_back(v);
            g[v].push_back(u);
        }

        for(int i=1;i<=n;i++) {
            if(!vis[i])
                num[cnt++] = dfs(i);
        }

        printf("Case %d: %lf\n",++kase,dp(1));

    }
    return 0;
}

时间: 2024-10-03 13:47:52

Uva 11600 期望DP的相关文章

UVa 11762 (期望 DP) Race to 1

设f(x)表示x转移到1需要的次数的期望,p(x)为不超过x的素数的个数,其中能整除x的有g(x)个 则有(1-g(x)/p(x))的概率下一步还是转移到x,剩下的情况各有1/p(x)的概率转移到x/y 根据全期望公式,f(x) = 1 + (1-g(x)/p(x)) * f(x) + sum{ 1/p(x) * f(x/y) | y是能整除x且不超过x的素数 } 代码是用记忆化搜索计算f的 1 #include <cstdio> 2 #include <cstring> 3 #i

UVa 11427 (期望 DP) Expect the Expected

设d(i, j)表示前i局每局获胜的比例均不超过p,且前i局共获胜j局的概率. d(i, j) = d(i-1, j) * (1-p) + d(i-1, j-1) * p 则只玩一天就就不再玩的概率Q = sum{d(n, i) | 0 ≤ i ≤ p*n} 那么期望为 这是一个无穷级数,可以用高数的一些知识来解决. 另1-Q = t 将1-Q带入t,并将左边的Q乘过去得: 书上还介绍了一种更简单的方法,假设所求期望为e 第一天玩完就去睡觉,概率为Q,期望为1:第一天玩得高高兴兴,概率为1-Q,

【bzoj4872】[Shoi2017]分手是祝愿 数论+期望dp

题目描述 Zeit und Raum trennen dich und mich. 时空将你我分开. B 君在玩一个游戏,这个游戏由 n 个灯和 n 个开关组成,给定这 n 个灯的初始状态,下标为从 1 到 n 的正整数.每个灯有两个状态亮和灭,我们用 1 来表示这个灯是亮的,用 0 表示这个灯是灭的,游戏的目标是使所有灯都灭掉.但是当操作第 i 个开关时,所有编号为 i 的约数(包括 1 和 i)的灯的状态都会被改变,即从亮变成灭,或者是从灭变成亮.B 君发现这个游戏很难,于是想到了这样的一个

HDOJ 1145 So you want to be a 2n-aire? 期望DP

期望DP So you want to be a 2n-aire? Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 267    Accepted Submission(s): 197 Problem Description The player starts with a prize of $1, and is asked a seq

uva 12723 概率dp

Dudu is a very starving possum. He currently stands in the first shelf of a fridge. This fridge iscomposed of N shelves, and each shelf has a number Qi (1 ≤ i ≤ N) of food. The top shelf, whereDudu is, is identified by the number 1, and the lowest is

HDU 4336 Card Collector (期望DP+状态压缩 或者 状态压缩+容斥)

题意:有N(1<=N<=20)张卡片,每包中含有这些卡片的概率,每包至多一张卡片,可能没有卡片.求需要买多少包才能拿到所以的N张卡片,求次数的期望. 析:期望DP,是很容易看出来的,然后由于得到每张卡片的状态不知道,所以用状态压缩,dp[i] 表示这个状态时,要全部收齐卡片的期望. 由于有可能是什么也没有,所以我们要特殊判断一下.然后就和剩下的就简单了. 另一个方法就是状态压缩+容斥,同样每个状态表示收集的状态,由于每张卡都是独立,所以,每个卡片的期望就是1.0/p,然后要做的就是要去重,既然

Topcoder SRM656div1 250 ( 期望DP )

Problem Statement    Charlie has N pancakes. He wants to serve some of them for breakfast. We will number the pancakes 0 through N-1. For each i, pancake i has width i+1 and deliciousness d[i].Charlie chooses the pancakes he is going to serve using t

期望dp 知识点

求期望dp有两种类型 1.概率dp 2.高斯消元 相关知识点可以看这里  一篇很好的文章  http://kicd.blog.163.com/blog/static/126961911200910168335852/ http://www.cnblogs.com/kuangbin/archive/2012/10/02/2710606.html 高斯消元  http://wenku.baidu.com/link?url=Q8ES7wreJk3et-VrHtp6CVNuyqX18YdB3c841-o

uva 11133 - Eigensequence(dp)

题目链接:uva 11133 - Eigensequence 题目大意:给定一个序列a,能够确定一个序列b,要求: 1)b[1]=a[1] 2)a[j?1]<b[j]≤a[j]且b[j]a[j]?a[j?1]为整数,j>1的时候 假设对于每一个ai=bi,则称b序列为Eigensequence序列. 如今给定a1和an,问有多少个Eigensequence序列. 解题思路:dp[i][j]表示第i个数为j的情况有多少种,假设k整除k-j,dp[i+1][k]+=dp[i][j]. #inclu