bzoj4637:期望
思路:最小生成树计数只不过加了一个期望,由于期望具有线性性质,就可以转化为每条边的期望之和,那么一条边的期望如何求呢,在最小生成树记数中,是把相同边权的一起处理,之后把属于连通块内的点缩点,也就是说,一条边只可能在它属于的连通块内对答案产生贡献,之后因为缩点而不会影响答案,因此一条边的期望就等于它在它所属的连通块内包含它的生成树个数除以那个连通块的生成树个数,而包含这条边的生成树个数就是该连通块内所有的生成树个数减去不包含这条边的生成树个数,然后用matrix-tree定理统计答案即可,因为这题要枚举边,所以最好写两个并查集,反正我之前的dfs写法没法写。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
using namespace std;
#define maxm 200005
#define maxn 10005
const long double eps=1e-9; int n,m,cnt,top;
int pos[maxn],stack[maxn];
bool instack[maxn];
long long tot;
long double ans,K[1000][1000],T[1000][1000]; vector<int> v[maxn]; struct edge{
int from,to,dis,val;
bool operator <(const edge &a)const{return dis<a.dis;}
}e[maxm]; inline int read(){
int x=0;char ch=getchar();
for (;ch<'0'||ch>'9';ch=getchar());
for (;ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-'0';
return x;
} struct union_find_set{
int fa[maxn];
int find(int x){return fa[x]==x?x:fa[x]=find(fa[x]);}
}u1,u2; long long gauss(){
int t,n=cnt-1,f=1;long double ans=1;
for (int i=1;i<n;i++){
for (t=i;t<=n;t++) if (fabs(K[t][i])>eps) break;if (t>n) return 0;
if (t!=i){for (int j=1;j<=n;j++) swap(K[i][j],K[t][j]);f=-f;}
for (int j=i+1;j<=n;j++)
if (fabs(K[j][i])>eps){
long double t=K[j][i]/K[i][i];
for (int k=i;k<=n;k++) K[j][k]-=K[i][k]*t;
}
}
for (int i=1;i<=n;i++) ans=ans*K[i][i];
return round(ans*f);
} void add(int x,int y,int val){
K[x][y]-=val,K[y][x]-=val;
K[x][x]+=val,K[y][y]+=val;
} int main(){
n=read(),m=read();
for (int i=1;i<=m;i++) e[i].from=read(),e[i].to=read(),e[i].dis=read(),e[i].val=read();
for (int i=1;i<=n;i++) u1.fa[i]=u2.fa[i]=i; sort(e+1,e+m+1);
for (int i=1,l=1;i<=m+1;i++){
int x=u1.find(e[i].from),y=u1.find(e[i].to);
if (x!=y){int u=u2.find(x),v=u2.find(y);if (u!=v) u2.fa[u]=v;}
if (e[i].dis!=e[i+1].dis){
for (int j=l;j<=i;j++){
int x=u1.find(e[j].from),y=u1.find(e[j].to);
if (x==y) continue; int u=u2.find(x);
if (!instack[u]) stack[++top]=u,instack[u]=1;
}
while (top){
instack[stack[top]]=0,cnt=0;
for (int j=l;j<=i;j++){
int x=u1.find(e[j].from),y=u1.find(e[j].to);
if (x==y) continue; int u=u2.find(x);
if (u==stack[top]){
if (!pos[x]) pos[x]=++cnt;
if (!pos[y]) pos[y]=++cnt;
add(pos[x],pos[y],1);
}
}
for (int a=1;a<=cnt;a++)
for (int b=1;b<=cnt;b++)
T[a][b]=K[a][b];
tot=gauss();
for (int a=1;a<=cnt;a++)
for (int b=1;b<=cnt;b++)
K[a][b]=T[a][b];
for (int j=l;j<=i;j++){
int x=u1.find(e[j].from),y=u1.find(e[j].to);
if (x==y) continue; int u=u2.find(x);
if (u==stack[top]){
for (int a=1;a<=cnt;a++)
for (int b=1;b<=cnt;b++)
T[a][b]=K[a][b];
add(pos[x],pos[y],-1);
long long tmp=gauss();
for (int a=1;a<=cnt;a++)
for (int b=1;b<=cnt;b++)
K[a][b]=T[a][b];
ans+=1.0*(tot-tmp)/tot*e[j].val;
}
}
for (int j=l;j<=i;j++){
int x=u1.find(e[j].from),y=u1.find(e[j].to);
if (x==y) continue;pos[x]=pos[y]=0;
}
for (int j=1;j<=cnt;j++)
for (int k=1;k<=cnt;k++)
K[j][k]=0;
top--;
}
for (int j=l;j<=i;j++){
int x=u1.find(e[j].from),y=u1.find(e[j].to);
if (x==y) continue;u1.fa[x]=y;
}
l=i+1;
}
}
printf("%.5lf",(double)ans);
return 0;
}
bzoj4637:期望的更多相关文章
- bzoj4637: 期望
Description 在米国有一所大学,名叫万国歌剧与信息大学(UniversalOperaandInformaticasUniversity).简称UOI大学.UO I大学的建筑与道路分布很有趣, ...
- 【BZOJ4637】期望 Kruskal+矩阵树定理
[BZOJ4637]期望 Description 在米国有一所大学,名叫万国歌剧与信息大学(UniversalOperaandInformaticasUniversity).简称UOI大学.UOI大学 ...
- 【BZOJ-3143】游走 高斯消元 + 概率期望
3143: [Hnoi2013]游走 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 2264 Solved: 987[Submit][Status] ...
- bzoj1415[NOI2005]聪聪和可可-期望的线性性
这道题之前我写过一个巨逗比的写法(传送门:http://www.cnblogs.com/liu-runda/p/6220381.html) 当时的原因是这道题可以抽象出和"绿豆蛙的归宿&qu ...
- hdu 4481 Time travel(高斯求期望)(转)
(转)http://blog.csdn.net/u013081425/article/details/39240021 http://acm.hdu.edu.cn/showproblem.php?pi ...
- 【BZOJ3036】绿豆蛙的归宿 概率与期望
最水的概率期望,推荐算法合集之<浅析竞赛中一类数学期望问题的解决方法> #include <iostream> #include <cstdio> using na ...
- UVA&&POJ离散概率与数学期望入门练习[4]
POJ3869 Headshot 题意:给出左轮手枪的子弹序列,打了一枪没子弹,要使下一枪也没子弹概率最大应该rotate还是shoot 条件概率,|00|/(|00|+|01|)和|0|/n谁大的问 ...
- 【BZOJ-1426】收集邮票 概率与期望DP
1426: 收集邮票 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 261 Solved: 209[Submit][Status][Discuss] ...
- 【BZOJ-1419】Red is good 概率期望DP
1419: Red is good Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 660 Solved: 257[Submit][Status][Di ...
随机推荐
- OpenCV训练分类器制作xml文档
OpenCV训练分类器制作xml文档 (2011-08-25 15:50:06) 转载▼ 标签: 杂谈 分类: 学习 我的问题:有了opencv自带的那些xml人脸检测文档,我们就可以用cvLoad( ...
- Java中3DES加密解密与其他语言(如C/C++)通信
国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...
- PowerShell远程安装应用程序
安装MSI包 使用PowerShell调用WMI对象,你可以执行下面的脚本来安装你的MSI安装包: $box="deviis01" #this is the name of you ...
- 用Bootstrap 写了个站点
近期发现vdceye的站点有些丑陋,就找了一个bootstrap工具,又一次把站点写了一遍 这个工具果然好用 http://vdceye.com/
- 简单详细的OD破解教程
2007-08-04 15:46作者:CCDebuger注:昨天在网上见到了这篇文章,但缺少插图,从另外一篇文章中也看到了类似的的教程文章,里面的插图质量实在不敢恭维.在一个论坛中正好下载了文章中所介 ...
- git克隆远程项目分支到本地对应分支
最近公司改用git了,研究了一下如何把远程的代码克隆到本地. 1. 配置对应信息 git config --global user.name git config --global user.emai ...
- Codeforces Round #322 (Div. 2) B. Luxurious Houses 水题
B. Luxurious Houses Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/581/pr ...
- BZOJ 1199: [HNOI2005]汤姆的游戏 计算几何暴力
1199: [HNOI2005]汤姆的游戏 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/p ...
- 设计模式 - 策略模式(Strategy Pattern) 具体解释
策略模式(Strategy Pattern) 具体解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26577879 本文版权全 ...
- "无法启动程序,因为计算机中丢失*.dll” 运行exe错误解决方法
笔者把编译生成的win32 Release exe文件复制到另外一台电脑上,却发现程序不能运行,报错如下: 报错提示缺失动态链接库pcl_common_release.dll,那为什么在编译生成的电脑 ...