思路:最小生成树计数只不过加了一个期望,由于期望具有线性性质,就可以转化为每条边的期望之和,那么一条边的期望如何求呢,在最小生成树记数中,是把相同边权的一起处理,之后把属于连通块内的点缩点,也就是说,一条边只可能在它属于的连通块内对答案产生贡献,之后因为缩点而不会影响答案,因此一条边的期望就等于它在它所属的连通块内包含它的生成树个数除以那个连通块的生成树个数,而包含这条边的生成树个数就是该连通块内所有的生成树个数减去不包含这条边的生成树个数,然后用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:期望的更多相关文章

  1. bzoj4637: 期望

    Description 在米国有一所大学,名叫万国歌剧与信息大学(UniversalOperaandInformaticasUniversity).简称UOI大学.UO I大学的建筑与道路分布很有趣, ...

  2. 【BZOJ4637】期望 Kruskal+矩阵树定理

    [BZOJ4637]期望 Description 在米国有一所大学,名叫万国歌剧与信息大学(UniversalOperaandInformaticasUniversity).简称UOI大学.UOI大学 ...

  3. 【BZOJ-3143】游走 高斯消元 + 概率期望

    3143: [Hnoi2013]游走 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2264  Solved: 987[Submit][Status] ...

  4. bzoj1415[NOI2005]聪聪和可可-期望的线性性

    这道题之前我写过一个巨逗比的写法(传送门:http://www.cnblogs.com/liu-runda/p/6220381.html) 当时的原因是这道题可以抽象出和"绿豆蛙的归宿&qu ...

  5. hdu 4481 Time travel(高斯求期望)(转)

    (转)http://blog.csdn.net/u013081425/article/details/39240021 http://acm.hdu.edu.cn/showproblem.php?pi ...

  6. 【BZOJ3036】绿豆蛙的归宿 概率与期望

    最水的概率期望,推荐算法合集之<浅析竞赛中一类数学期望问题的解决方法> #include <iostream> #include <cstdio> using na ...

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

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

  8. 【BZOJ-1426】收集邮票 概率与期望DP

    1426: 收集邮票 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 261  Solved: 209[Submit][Status][Discuss] ...

  9. 【BZOJ-1419】Red is good 概率期望DP

    1419: Red is good Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 660  Solved: 257[Submit][Status][Di ...

随机推荐

  1. ecshop数据库表结构

    ecs_account_log //用户账目日志表 ecs_activity //活动表(代码,名称,开始,结束,描述) ecs_ad //广告表(位置,类型,名称,链接,图片,开始,结束,广告主相关 ...

  2. Fixed theorems

    Banach Schauder Bourbaki-Kneser

  3. Uploadify 3.2 参数属性、事件、方法函数详解

    一.属性 属性名称 默认值 说明 auto true 设置为true当选择文件后就直接上传了,为false需要点击上传按钮才上传 . buttonClass ” 按钮样式 buttonCursor ‘ ...

  4. jQuery遍历json

    使用 each var anObject = {one:1,two:2,three:3}; $.each(anObject,function(name,value) { alert(name); al ...

  5. 设计模式之十三:适配器模式(Adapter)

    适配器模式: 将一个类的接口转换成另外一个期望的类的接口.适配器同意接口互不兼容的类一起工作. Convert the interface of a class into another interf ...

  6. materialish-progress

    https://github.com/pnikosis/materialish-progress materialish-progress-master.zip

  7. Git链接到自己的Github(1)简单的开始

    好长时间没上来弄东西了,今天回来先开始弄下Git,之后再继续写uboot与kernel的编译,在版本控制下更加宏观地观察每次的变化. 1.在ubuntu中安装git $ sudo apt-get in ...

  8. 可视化swing界面编辑--转载

    原文地址:http://279234058.iteye.com/blog/2200122 今天发现了一个WindowBuilder插件,功能好强大,啊哈哈,从此告别手动编辑swing界面代码,直接像V ...

  9. Editing and Deleting Data

    Editing and Deleting Data In the previous chapter we've come to learn how we can use the zend-form a ...

  10. springMVC学习笔记三

    十三.springMVC和spring集成 配置文件,spring的配置路径applicationContext.xml 在默认的web-inf下面 strut的配置文件默认在src下面 用了什么框架 ...