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. C++ Primer Plus学习:第九章

    C++第九章:内存模型与名称空间 C++在内存中存储数据方面提供了多种选择.可直接选择保留在内存中的时间长度(存储持续性)以及程序哪一部分可以访问数据(作用域和链接)等. 单独编译 程序分为三个部分: ...

  2. Jquery获取属性值

    jq获取某个标签内的属性值:$("#TeamPerformanceYearUl li:eq(0)").attr('data') jq获取li或者td第一个属性(索引值从零开始)$( ...

  3. ngx_http_rewrite_module(重定向)

    1:指定rewrite规则 rewrite regex replacement [flag];   什么是rewrite规则:If the specified regular expression m ...

  4. Qt多线程-QThread

    版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:Qt多线程-QThread     本文地址:http://techieliang.com/2 ...

  5. HDU 2154 跳舞毯

    http://acm.hdu.edu.cn/showproblem.php?pid=2154 Problem Description 由于长期缺乏运动,小黑发现自己的身材臃肿了许多,于是他想健身,更准 ...

  6. centOS 中安装 Redis

    之前安装过了 jdk,mysql,tomcat,这次安装 Redis,最开始是将 redis 安装在 windows 下 run 的,这时安装在 Linux 里面试试. 1 . 首先得安装 c环境,用 ...

  7. UVA11625_Lines of Containers

    题意很简单,给你一个n*m的矩阵,现在问你这个矩阵能否变为标准矩阵(即数字从小到大),如果能最少需要几步呢? 其实是个赤果果的水题.记得暑假安叔也出过一个类似的题目,那个好像是在codeforces上 ...

  8. resp.getWriter().print的注意点

  9. java 类型转型

  10. Jmeter介绍+安装

    JMeter介绍 JMeter 是Apache 基金会Jakarta 上的一个纯Java 开源项目,起初用于基于Web 的压力测试(pressure test),后来其应用范围逐渐扩展到对文件传输FT ...