https://vjudge.net/problem/UVA-1390

题意:

给出n个点m条边的无向图,

每次随机加一条非自环的边,(加完后可出现重边),

添加每条边的概率是相等的

求使图连通的期望添边次数

只关心图的连通状况,即连通块的个数和大小

所以可以用{a1,a2,a3……an} 表示状态(n个连通块,每个连通块大小为ai)

添加一条边后有两种可能

1、状态不变

2、状态变为 {a1,……ai+aj,……a_n-1}

将状态哈希

dp[i]表示哈希后为i的状态 添边至连通的期望次数

dp[i]= dp[i]*p + dp[k1]*p1 + dp[k2]*p2  + …… + dp[km]*pm

其中p表示状态不变的概率,p1=Σ C(ai,2)/ C(n,2)

pi表示装移到ki这种状态的概率 ,pi= (ai*aj) / C(n,2)

上述式子移项得状态转移方程:dp[i]=(dp[k1]*p1 + dp[k2]*p2  + …… + dp[km]*pm)/(1-p)

#include<cstdio>
#include<cstring>
#include<algorithm>
const int mod=;
int n,m;
int fa[],siz[];
struct sta
{
int x[];
bool flag;
double val;
void clear() { memset(x,,sizeof(x)); }
void sort() { std::sort(x,x+); }
int hashme()
{
int v=;
for(int i=,b=;i&&x[i];i--)
{
v+=x[i]*b;
v%=mod;
b*=;
b%=mod;
}
return v;
}
bool operator == (sta b)
{
for(int i=;i<;i++)
if(x[i]!=b.x[i]) return false;
return true;
}
bool operator != (sta b)
{
return *this == b ? false : true;
}
}st,hash[mod];
int find(int i) { return fa[i]==i ? i : fa[i]=find(fa[i]); }
double gethash(sta st)
{
int x=st.hashme();
while(hash[x].flag && hash[x]!=st)
if(++x==mod) x=;
return hash[x]==st ? hash[x].val : -;
}
double inhash(sta st)
{
int x=st.hashme();
while(hash[x].flag)
if(++x==mod) x=;
hash[x]=st; hash[x].flag=true;
}
double dp(sta st)
{
if(st.hashme()==n) return ;
double x=gethash(st);
if(x!=-) return x;
double tmp=,ans=;
for(int i=;i<;i++)
tmp+=st.x[i]*(st.x[i]-)/;
for(int i=;i<;i++)
for(int j=i+;j<;j++)
{
if(!st.x[i] || !st.x[j]) continue;
sta tmp=st;
tmp.x[i]+=tmp.x[j];
tmp.x[j]=;
tmp.sort();
ans+=st.x[i]*st.x[j]*dp(tmp);
}
ans/=n*(n-)/;
ans++;
ans/=-tmp/(n*(n-)/);
st.val=ans;
inhash(st);
return ans;
}
int main()
{
int u,v;
while(scanf("%d%d",&n,&m)!=EOF)
{
for(int i=;i<mod;++i) hash[i].flag=false;
for(int i=;i<=n;i++) fa[i]=i;
while(m--)
{
scanf("%d%d",&u,&v);
fa[find(u)]=find(v);
}
st.clear();
memset(siz,,sizeof(siz));
for(int i=;i<=n;i++) siz[find(i)]++;
int tot=;
for(int i=;i<=n;i++)
if(siz[i]) st.x[tot++]=siz[i];
st.sort();
printf("%.7lf\n",dp(st));
}
}

UVA 1390 Interconnect的更多相关文章

  1. uva 1390 - Interconnect(期望+哈希+记忆化)

    option=com_onlinejudge&Itemid=8&page=show_problem&category=514&problem=4136&mosm ...

  2. PatentTips - Device virtualization and assignment of interconnect devices

    BACKGROUND Standard computer interconnects, particularly for personal computers or workstations, may ...

  3. Greenplum记录(一):主体结构、master、segments节点、interconnect、performance monitor

    结构:Client--master host--interconnect--segment host 每个节点都是单独的PG数据库,要获得最佳的性能需要对每个节点进行独立优化. master上不包含任 ...

  4. uva 1354 Mobile Computing ——yhx

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAABGcAAANuCAYAAAC7f2QuAAAgAElEQVR4nOy9XUhjWbo3vu72RRgkF5

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

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

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

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

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

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

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

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

  9. UVA数学入门训练Round1[6]

    UVA - 11388 GCD LCM 题意:输入g和l,找到a和b,gcd(a,b)=g,lacm(a,b)=l,a<b且a最小 g不能整除l时无解,否则一定g,l最小 #include &l ...

随机推荐

  1. 2018-2019-20172321 《Java软件结构与数据结构》第四周学习总结

    2018-2019-20172321 <Java软件结构与数据结构>第四周学习总结 教材学习内容总结 第六章 6.1列表集合 列表集合是一种概念性表示法,其思想是使事物以线性列表的方式进行 ...

  2. 第二章:Internet地址结构

    引言 本章主要介绍了: 如何为Internet中的设备分配IP地址. 有助于理由可扩展性的地址结构分配方式. 特殊用途的地址. 表示IP地址 IPv4地址 长32位,采用点分四组或点分十进制来表示. ...

  3. OA_1界面

    <%@ page language="java" contentType="text/html;charset=GB18030" pageEncoding ...

  4. lintcode-463-整数排序

    463-整数排序 给一组整数,按照升序排序,使用选择排序,冒泡排序,插入排序或者任何 O(n2) 的排序算法. 样例 对于数组 [3, 2, 1, 4, 5], 排序后为:[1, 2, 3, 4, 5 ...

  5. Windows上安装、配置MySQL的常见问题

    一,MySQL的下载安装 MySQL的安装过程就不说了,基本上和一般软件的安装过程没什么两样,就是一路点next,设置的root用户的密码要牢记.具体教程可以参考:http://jingyan.bai ...

  6. TCP系列51—拥塞控制—14、TLP、ER与拥塞控制

    一.概述 这里的重点是介绍TLP.ER与拥塞控制并不是介绍TLP和ER本身,因此TLP和ER的详细内容请翻前文. 在TLP与拥塞控制的交互中有几个点需要注意 1.TLP触发的重传后,TCP仍然处于Op ...

  7. 删除多余的自编译的内核、mysql连接不了的问题

    1.删除多余的自编译的内核 每次Debian发布内核更新,总是有某些内核选项跟自己的硬件不配套,要自己编译内核.编译多了,多余的内核就占用了多余的硬盘空间.我就试过因为/boot分区满了,而导致编译内 ...

  8. app测试更多机型系统解决方法

    手头上测试机有限,不可能每个机型每个系统都 有一部手机,此时寻求一个什么都有的测试平台就显得尤为重要了. 作为小白的我刚刚使用了一波腾讯优测,简单粗暴有效给力,而且新注册认证用户还有60min免费使用 ...

  9. php框架中常用的设计模式

    1.单例模式 //单例模式 class Demo { private static $obj; private function __construct() { } private function ...

  10. php面试必知必会常见问题

    1 说出常用的10个数组方法 我觉得数组比较最能体现PHP基础语法的一个数据结构了,下面给大家列一下常用的10个关于操作数组的函数 in_array(判断数组中是否有某个元素) implode(将数组 ...