题目:https://www.luogu.org/problemnew/show/P3343

1.那个时间与边的大小排名有关,所以需要求一下最大边的期望排名就行。

2.期望排名是这样算的:(排名为1的概率 * 1(1的值) + 排名为2的概率 * 2 + ……) / (m+1)

  仔细一想可以变成这样:(排名>=1的概率 + 排名>=2的概率 + ……) / (m+1)

  可以是这样?——(连0时不能联通的概率 + 连1时不能联通的概率 + ……) / (m+1)

    这里的0、1等可以看作是“前几条边”,也就是“几条边”;

3.这些概率不用每一步都就是概率,可以算的是方案、最后再除以所有方案数;

  这个“几条边”的方案可以用dp来推(只要注意转移到它的状态里的边不重复)!状压记录点集。

  发现  用了 i 条边不连通的方案数 + 用了 i 条边连通的方案数 = 从m条边里选 i 条边的方案数,所以求出一个就能算出另一个了。

    如果求“用了 i 条边连通的方案数”,每一种情况由三部分构成:一条边和这条边两边的两个点集;

      我们需要枚举一条被选的边,再枚举一个端点的点集,剩下的点构成另一个点集,这两个点集的“连通”方案数相乘(还要枚举其中一个点集用了多少条边)。

      但状态里记录的是点集,要枚举那条边有点麻烦。

    如果求“用了 i 条边不连通的方案数”,每一种情况就只由两个点集转移来,无需有中间那条边;

      枚举这两个点集时为了不重不漏,可以确定一个“划分点”,枚举的那个点集必须包含它,并限制枚举的这个点集是连通的;然后剩下的点随便连边(组合数)。

(2018.6.16 PS:这个点必须被限制在一个连通块里。不能把它限制在随便的那个部分里,会重复。一条边也没有的图就是一个例子。)

4.代码里:组合数的赋初值!别忘了zh[0][0]!!还应注意一些地方从0或从1开始。

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n,m,dp[][][(<<)+],lm;
int siz[(<<)+],zh[][];
int head[],num[<<],pre[];
double ans;
bool vis[],in[],ed[];
struct Edge{
int next,to;
Edge(int n=,int t=):next(n),to(t) {}
}edge[];
int dfs(int cur)
{
vis[cur]=;int ret=;
for(int i=head[cur],v;i;i=edge[i].next)
if(in[v=edge[i].to])
{
if(!ed[i])ret++,ed[i]=;
if(!vis[v])ret+=dfs(v);
}
return ret;
}
void init()
{
lm=(<<n);
for(int i=;i<=n;i++)num[<<(i-)]=i;
for(int i=;i<lm;i++)
{
int k=i;
memset(ed,,sizeof ed);memset(vis,,sizeof vis);
memset(in,,sizeof in);
while(k)in[num[k&(-k)]]=,k-=(k&(-k));
for(int j=;j<=n;j++)if(in[j])siz[i]+=dfs(j);siz[i]>>=;
}
zh[][]=;//!!!!!!!
for(int i=;i<=m;i++)
{
zh[][i]=;
for(int j=;j<i;j++)
zh[j][i]=zh[j][i-]+zh[j-][i-];
zh[i][i]=;
}
for(int i=;i<lm;i++)dp[][][i]=;
for(int i=;i<=n;i++)dp[][][<<(i-)]=,dp[][][<<(i-)]=;
}
int main()
{
// freopen("zjsc.out","w",stdout);
scanf("%d%d",&n,&m);int u,v;
for(int i=;i<=m;i++)
{
scanf("%d%d",&u,&v);
edge[i]=Edge(head[u],v);head[u]=i;
edge[i+m]=Edge(head[v],u);head[v]=i+m;
// dp[1][1][(1<<(u-1))|(1<<(v-1))]=1;
}
init();
// for(int i=1;i<lm;i++)if(!dp[1][1][i])dp[0][1][i]=1;
for(int i=;i<=m;i++)
for(int s=;s<lm;s++)
{
int k=;for(;(s&(<<(k-)))==;k++);
for(int c=((s-)&s);c;c=((c-)&s))
if(c&(<<(k-)))
{
// if(i==1)printf("s=%d c=%d\n",s,c);
for(int j=;j<=i;j++)//0~i
{
// if(i==1&&j==1)printf(" dp1=%d\n",dp[1][j][c]);
dp[][i][s]+=dp[][j][c]*zh[i-j][siz[s^c]];
// if(i==1&&s==7&&c==5)
// printf("j=%d dp1jc=%d zh=%d dp0is=%d\n",
// j,dp[1][j][c],zh[i-j][siz[s^c]],dp[0][i][s]);
// if(i==1&&dp[0][i][s])printf("j=%d s=%d dp0=%d\n",j,s,dp[0][i][s]);
}
}
dp[][i][s]=zh[i][siz[s]]-dp[][i][s];
// if(i==1)printf("(s=%d dp1=%d)\n",s,dp[1][i][s]);
}
// for(int i=1;i<=n;i++)
// {
// pre[i]=dp[0][i-1][lm-1]-dp[0][i][lm-1];
// pre[i]/=zh[i][n];
// }
// for(int i=1;i<=n;i++)
// ans+=(double)i/(n+1)*pre[i];
for(int i=;i<m;i++)ans+=(double)dp[][i][lm-]/(double)zh[i][m];//其实是<m,但dp[0][m][lm-1]肯定是0
printf("%.6lf",(double)ans/(double)(m+));//已求者为排名期望
return ;
}

  

洛谷3343(ZJOI2015)地震后的幻想乡的更多相关文章

  1. [bzoj3925] [洛谷P3343] [ZJOI2015] 地震后的幻想乡

    Description 傲娇少女幽香是一个很萌很萌的妹子,而且她非常非常地有爱心,很喜欢为幻想乡的人们做一些自己力所能及的事情来帮助他们. 这不,幻想乡突然发生了地震,所有的道路都崩塌了.现在的首要任 ...

  2. 洛谷P3343 [ZJOI2015]地震后的幻想乡 [DP,概率期望]

    传送门 思路 题目给了一个提示:对于\(n\)个\([0,1]\)的随机变量,其中第\(k\)小的期望大小是\(\frac{k}{n+1}\). 这引导我们枚举边的相对大小的全排列,然后求最小生成树 ...

  3. 洛谷 P3343 - [ZJOI2015]地震后的幻想乡(朴素状压 DP/状压 DP+微积分)

    题面传送门 鸽子 tzc 竟然来补题解了,奇迹奇迹( 神仙题 %%%%%%%%%%%% 解法 1: 首先一件很明显的事情是这个最小值可以通过类似 Kruskal 求最小生成树的方法求得.我们将所有边按 ...

  4. 【BZOJ3925】[ZJOI2015]地震后的幻想乡(动态规划)

    [BZOJ3925][ZJOI2015]地震后的幻想乡(动态规划) 题面 BZOJ 洛谷 题解 题目里面有一句提示:对于\(n\)个\([0,1]\)之间的随机变量\(x1,x2,...,xn\),第 ...

  5. 【洛谷3343_BZOJ3925】[ZJOI2015]地震后的幻想乡(状压 DP_期望)

    题目: 洛谷 3343 BZOJ 3925 分析: 谁给我说这是个期望概率神题的,明明没太大关系好吧 「提示」里那个结论哪天想起来再问 Jumpmelon 怎么证. 首先,由于开始修路前 \(e_i\ ...

  6. 题解-ZJOI2015地震后的幻想乡

    Problem bzoj & 洛谷 题意简述:给定一个\(n\)(\(n\leq 10\))个点\(m\)条边的无向图,每条边的权值为一个\(0\)到\(1\)之间的连续随机变量,求图的最小生 ...

  7. BZOJ3925: [Zjoi2015]地震后的幻想乡

    Description 傲娇少女幽香是一个很萌很萌的妹子,而且她非常非常地有爱心,很喜欢为幻想乡的人们做一些自己力所能及的事情来帮助他们. 这不,幻想乡突然发生了地震,所有的道路都崩塌了.现在的首要任 ...

  8. [ZJOI2015]地震后的幻想乡(期望+dp)

    题目描述 傲娇少女幽香是一个很萌很萌的妹子,而且她非常非常地有爱心,很喜欢为幻想乡的人们做一些自己力所能及的事情来帮助他们. 这不,幻想乡突然发生了地震,所有的道路都崩塌了.现在的首要任务是尽快让幻想 ...

  9. BZOJ3925: [Zjoi2015]地震后的幻想乡【概率期望+状压DP】

    Description 傲娇少女幽香是一个很萌很萌的妹子,而且她非常非常地有爱心,很喜欢为幻想乡的人们做一些自己力所能及的事情来帮助他们. 这不,幻想乡突然发生了地震,所有的道路都崩塌了.现在的首要任 ...

随机推荐

  1. PHP中__autoload()与spl_autoload_register()函数的用法与区别

    _autoload() 函数在PHP文档中的解释是试图使用尚未被定义的类时自动调用.通过调用此函数,脚本引擎在 PHP 出错失败前有了最后一个机会加载所需的类. 如何理解这句话,我们首先看下面一个简单 ...

  2. Codeforces Round #319 (Div. 2) B. Modulo Sum 抽屉原理+01背包

    B. Modulo Sum time limit per test 2 seconds memory limit per test 256 megabytes input standard input ...

  3. [原][osgearth]osgearth本地(离线)数据源处理小结

    参考:http://docs.osgearth.org/en/latest/data.html Processing Local Source Data If you have geospatial ...

  4. mong大牛的blog

    MongoDB权威指南(3)-查询1.find方法介绍在不传入参数的情况下,find方法缺省使用  http://www.educity.cn/wenda/389594.html 这个归纳的比较好:可 ...

  5. 递归--练习2--noi6261汉诺塔

    递归--练习2--noi6261汉诺塔 一.心得 先把递推公式写出来,会很简单的 二.题目 6261:汉诺塔问题 总时间限制:  1000ms 内存限制:  65536kB 描述 约19世纪末,在欧州 ...

  6. Solaris 11 让 ls 的输出 带上颜色

    Solaris 默认的ls , 是不会显示 文件和文件夹的颜色的. 我们可以利用 gnu 的 ls 命令. 修改:~/.bashrc alias ls='/usr/gnu/bin/ls --color ...

  7. win32程序应用mfc库

    引入<afx.h> 此时会出现如下错误: #ifdef _DLL#ifndef _AFXDLL#error Building MFC application with /MD[d] (CR ...

  8. 高可用数据采集平台(如何玩转3门语言php+.net+aauto)

    同类文章:高并发数据采集的架构应用(Redis的应用) 吐槽下:本人主程是PHP,团队里面也没有精通.net的人才,为了解决这个平台方案,还是费了一部分劲. 新年了,希望有个新的开始.技术+团队管理都 ...

  9. iOS开发之 - 键盘处理神器 IQKeyboardManager

    平常在开发中,用到输入框的地方不胜其数,当输入框位于屏幕底部时,弹起的键盘很可能覆盖输入框,导致用户看不到输入结果,体验较差...... IQKeyboardManager 可以很简单快捷的解决键盘遮 ...

  10. 201621123006 《Java程序设计》第10周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常相关内容. 2. 书面作业 本次PTA作业题集异常 1. 常用异常 结合题集题目7-1回答 1.1 自己以前编写的代码中经常出现 ...