题目大意:有一个n个点的完全图,有些路上有妖怪。现在一个人从一号点出发,每天随机走向另一个点,消灭路上的妖怪,问平均几天后所有点之间存在没有妖怪的路径。点数≤30。

  看到点这么少肯定状压,看见存不下肯定map,事实上这题数据不够强力,很多复杂度不对的东西都可以艹过去(比如我的算法)。

  首先可以缩点,把本来存在路径的点缩起来。

  设f(x)表示:当安全的点集为x时,处理完所有的点的期望次数。

  那么可以写出一个解不出来的式子:

  

  p表示走到自己集合内的概率,pi表示走到另一个点的概率。

  解不出来是因为存在自己更新自己。怎么办呢?正常人都会想着化式子吧。

  

  

  

  

  发现每次处理,集合都会变大。

  这个时候打一个记忆搜就可以了。边界状态是f[2^n-1]=0.00。

#include    <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <map>
#include <cstring>
#include <queue>
#include <complex>
#include <stack>
#define LL long long int
#define dob double
#define FILE "11600"
using namespace std; const int N = ;
map<int,double>Mp;
int n,m,fa[N],bin[N],U[N]; inline int gi(){
int x=,res=;char ch=getchar();
while(ch>''||ch<''){if(ch=='-')res*=-;ch=getchar();}
while(ch<=''&&ch>='')x=x*+ch-,ch=getchar();
return x*res;
} inline int find(int x){
return x==fa[x]?x:fa[x]=find(fa[x]);
} inline double dfs(int S){
if(Mp.find(S)!=Mp.end())return Mp[S];
double Ans=0.0,sz=0.0;
for(int i=;i<=n;++i){
if(S&bin[i-]){sz+=1.0;continue;}
Ans+=dfs(S|U[i]);
}
Ans=(1.0*n-1.0)/(1.0*n-sz)*(Ans/(1.0*n-1.0)+1.0);
return Mp[S]=Ans;
} inline void solve(){
Mp.clear();bin[]=;
n=gi();m=gi();if(n==){puts("");return;}
for(int i=;i<=n;++i)fa[i]=i,bin[i]=bin[i-]<<,U[i]=bin[i-];
for(int i=;i<=m;++i){
int f1=find(gi()),f2=find(gi());
if(f1!=f2)fa[f2]=f1,U[f1]|=U[f2];
}
for(int i=;i<=n;++i)U[i]=U[find(i)];
Mp[bin[n]-]=0.0;printf("%.10lf\n",dfs(U[]));
} int main(){
freopen(FILE".in","r",stdin);
freopen(FILE".out","w",stdout);
int Case=gi();
for(int t=;t<=Case;++t)
printf("Case %d: ",t),solve();
fclose(stdin);fclose(stdout);
return ;
}

Masud Rana

UVA 11600 Masud Rana的更多相关文章

  1. UVA 11600 Masud Rana(概率dp)

    当两个城市之间有安全的道路的时候,他们是互相可到达的,这种关系满足自反.对称和传递性, 因此是一个等价关系,在图论中就对应一个连通块. 在一个连通块中,当前点是那个并不影响往其他连通块的点连边,因此只 ...

  2. Uva 11600 期望DP

    题意:n个城市,相互可达(有n(n-1)/2条边),其中有一些道路上面有妖怪,现在,从1号城市出发,随机挑取一个城市走去,这个道路上的妖怪就会被消灭,求: 在平均情况下,需要走多少步,使得任意两个城市 ...

  3. DP 题集 2

    关于 DP 的一些题目 String painter 先区间 DP,\(dp[l][r]\) 表示把一个空串涂成 \(t[l,r]\) 这个子串的最小花费.再考虑 \(s\) 字符串,\(f[i]\) ...

  4. UVA 11600-Masud Rana(状压,概率dp)

    题意: 有n个节点的图,开始有一些边存在,现在每天任意选择两点连一条边(可能已经连过),求使整个图联通的期望天数. 分析: 由于开始图可以看做几个连通分量,想到了以前做的一个题,一个点代表一个集合(这 ...

  5. uva 1354 Mobile Computing ——yhx

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAABGcAAANuCAYAAAC7f2QuAAAgAElEQVR4nOy9XUhjWbo3vu72RRgkF5

  6. UVA 10564 Paths through the Hourglass[DP 打印]

    UVA - 10564 Paths through the Hourglass 题意: 要求从第一层走到最下面一层,只能往左下或右下走 问有多少条路径之和刚好等于S? 如果有的话,输出字典序最小的路径 ...

  7. UVA 11404 Palindromic Subsequence[DP LCS 打印]

    UVA - 11404 Palindromic Subsequence 题意:一个字符串,删去0个或多个字符,输出字典序最小且最长的回文字符串 不要求路径区间DP都可以做 然而要字典序最小 倒过来求L ...

  8. UVA&&POJ离散概率与数学期望入门练习[4]

    POJ3869 Headshot 题意:给出左轮手枪的子弹序列,打了一枪没子弹,要使下一枪也没子弹概率最大应该rotate还是shoot 条件概率,|00|/(|00|+|01|)和|0|/n谁大的问 ...

  9. UVA计数方法练习[3]

    UVA - 11538 Chess Queen 题意:n*m放置两个互相攻击的后的方案数 分开讨论行 列 两条对角线 一个求和式 可以化简后计算 // // main.cpp // uva11538 ...

随机推荐

  1. TFboy养成记 tf.cast,tf.argmax,tf.reduce_sum

    referrence: 莫烦视频 先介绍几个函数 1.tf.cast() 英文解释: 也就是说cast的直译,类似于映射,映射到一个你制定的类型. 2.tf.argmax 原型: 含义:返回最大值所在 ...

  2. RAC(ReactiveCocoa)使用方法(一)

    RAC(ReactiveCocoa)使用方法(一) RAC(ReactiveCocoa)使用方法(二) 什么是RAC? 最近回顾了一下ReactiveCocoa的方法,也看了一些人的文章,现写篇文章总 ...

  3. Python之登录接口

    要求 1.输入用户名密码2.认证成功后显示欢迎信息3.输错三次后锁定 思路 没有数据库,这里使用本地文件,一共需要两个文件:       黑名单的文件:黑名单里检测,不让登录     用户信息文件:将 ...

  4. 在LwIP 协议栈移植 Snap 7

    本文欢迎引用,转载. 引用,转载请标明出处! 调试完毕源码将上传到GitHub 为了嵌入式系统与STEP 7 PLC 通过S7 协议通讯,尝试移植 Snap 7 到STM32F407 cpu 上. 今 ...

  5. buttongroup中content一次性加载的解决方法

    buttongroup一次性加载所有内容的解决方法 如下图所示: 第一步: 设置windowcontainer的autoLoad属性为false(默认情况下autoLoad属性为true,所以会加载所 ...

  6. 用python爬取app照片

    首先下载一个斗鱼(不下载也可以,url都在这了对吧) 通过抓包,抓取到一个json的数据包,得到下面的地址 观察测试可知,通过修改offset值就是相当于app的翻页 访问这个url,返回得到的是一个 ...

  7. Docker 使用教程

    概括  Docker与传统虚拟机的区别 与传统虚拟机的区别  Docker的安装 的安装  Docker daemon , client , containerd  镜像与容器操作  容器运 ...

  8. uva 471 - Magic Numbers

    题意:给出一个数n,问有多少组数满足是s1/ s2 =n,要求组成s1和s2的数字没有重复的. 分析:枚举,然后二进制判断各位数字是否相同. #include<iostream> #inc ...

  9. 前端测试框架Jest系列教程 -- Matchers(匹配器)

    写在前面: 匹配器(Matchers)是Jest中非常重要的一个概念,它可以提供很多种方式来让你去验证你所测试的返回值,本文重点介绍几种常用的Matcher,其他的可以通过官网api文档查看. 常用的 ...

  10. oracle中 merge into 的用法

    很多时候我们需要通过筛选条件同时对表进行 更新,插入,删除 等操作.这样如果我们单一的去操作表会显得很麻烦,下面会说到这个merge  into 的用法会极大的优化我们操作表的时间和代码量. 举例,先 ...