UVA 1390 Interconnect
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的更多相关文章
- uva 1390 - Interconnect(期望+哈希+记忆化)
option=com_onlinejudge&Itemid=8&page=show_problem&category=514&problem=4136&mosm ...
- PatentTips - Device virtualization and assignment of interconnect devices
BACKGROUND Standard computer interconnects, particularly for personal computers or workstations, may ...
- Greenplum记录(一):主体结构、master、segments节点、interconnect、performance monitor
结构:Client--master host--interconnect--segment host 每个节点都是单独的PG数据库,要获得最佳的性能需要对每个节点进行独立优化. master上不包含任 ...
- uva 1354 Mobile Computing ——yhx
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAABGcAAANuCAYAAAC7f2QuAAAgAElEQVR4nOy9XUhjWbo3vu72RRgkF5
- UVA 10564 Paths through the Hourglass[DP 打印]
UVA - 10564 Paths through the Hourglass 题意: 要求从第一层走到最下面一层,只能往左下或右下走 问有多少条路径之和刚好等于S? 如果有的话,输出字典序最小的路径 ...
- UVA 11404 Palindromic Subsequence[DP LCS 打印]
UVA - 11404 Palindromic Subsequence 题意:一个字符串,删去0个或多个字符,输出字典序最小且最长的回文字符串 不要求路径区间DP都可以做 然而要字典序最小 倒过来求L ...
- UVA&&POJ离散概率与数学期望入门练习[4]
POJ3869 Headshot 题意:给出左轮手枪的子弹序列,打了一枪没子弹,要使下一枪也没子弹概率最大应该rotate还是shoot 条件概率,|00|/(|00|+|01|)和|0|/n谁大的问 ...
- UVA计数方法练习[3]
UVA - 11538 Chess Queen 题意:n*m放置两个互相攻击的后的方案数 分开讨论行 列 两条对角线 一个求和式 可以化简后计算 // // main.cpp // uva11538 ...
- 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 ...
随机推荐
- c# 画一个报告
填充控件的grafics属性: private void printReportPage(object sender, System.Drawing.Printing.PrintPageEventAr ...
- C++:const_cast的简单理解
前言:const_cast是我比较头疼的一个知识点,最近查阅了很多资料,也翻看了很多他人的博客,故在此将自己目前学习到的有关const_cast知识做一个简单的总结 一.什么是const_cast 简 ...
- IT就业·软件工程之我见
随着计算机技术的飞速发展,让人们深切感受到科技让生活更美好的真正含义. 现如今我们的正常生活,社交都越来越离不开网络和终端,因特网和各种终端设备的组合让我们即使相距千里,也能面对面对话交流:购物,我们 ...
- Laravel中如何添加新字段,如何指定在某个字段后而不是添加在最后
解答:
- Android定位测试(深坑)
问题:我们是一个海外app,市场部去马来西亚打开那边的市场,发现了一个问题,就是我们的app定位有问题,还是成都的定位,主要原因是在马来西亚使用这个app,请求中带的经纬度参数是成都的,导致服务器返回 ...
- 第91天:CSS3 属性选择器、伪类选择器和伪元素选择器
一.属性选择器 其特点是通过属性来选择元素,具体有以下5种形式: 1.E[attr] 表示存在attr属性即可: div[class] 2.E[attr=val] 表示属性值完全等于val: ...
- @Retention(保留) 此注解用于运行时候(反射)时候使用 如果不使用的话 在反射时候无法获取到注解的值
@Retention(保留) 此注解用于运行时候(反射)时候使用 如果不使用的话 在反射时候无法获取到注解的值
- 【HLSDK系列】Delta 详解
服务端和客户端总是需要互相交换数据,来做到实时的游戏体验. 很久之前,我们的网速都不是很快,甚至带宽只有 1Mbps (128KB/s)这样的速度,作为当时一个网络实时对战游戏,每时每刻都要传递数据, ...
- bug:margin合并
demo1和demo2存在margin合并问题:外边距合并指的是,当两个垂直外边距相遇时,它们将形成一个外边距.合并后的外边距的高度等于两个发生合并的外边距的高度中的较大者.弥补方案:bfc; 添加一 ...
- CodeForces - 955B(用char会超时。。。)
#include <bits/stdc++.h> #define mem(a, b) memset(a, b, sizeof(a)) using namespace std; , INF ...