给一张 n 个点 m 条边的无向连通图,每条边是黑边或白边 ,有边权。问有多少棵恰好有k条白边,且在此前提下边权和最小的生成树。mod 1e9+7。
首先看一看这道题。
ACM Live Archieve 7138
这里有一个良心的题解。
题解

对于恰好k条白边的要求,我们可以二分一个权,给每条白边加上这个权,再最小生成树,注意相同边权白边排前面,如果最小生成树中白边数量>=k判定为可行,否则判定为不可行。
这不就是bzoj2654吗?
最后这题要求的是最小生成树计数,不是生成树计数。不过我们可以通过乘法原理和分段的思想转化为多次生成树计数。这不就是bzoj1016吗?
因为某些玄学bug一直WA30分QAQ
注意可能相同边权的边全部连了之后,各个联通块仍然不连通,所以要提前在他们之间连一些黑边,不影响答案。
题解链接
其实是把三道题强行拼在一起qwq

#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<cassert>
#define int long long
using namespace std;
const int N=105,M=10005,mod=1000000007;
int n,m,k,l,r,mid,tot,fa[N],pa[N],res[N],ans[N],tmp[N],id[N],num[N],x[N],y[N];
struct edge{int u,v,d,c;
}e[M];
bool cmp(edge a,edge b){return a.d==b.d?a.c<b.c:a.d<b.d;
}
int find(int u){return u==fa[u]?u:fa[u]=find(fa[u]);
}
int get(int u){return u==pa[u]?u:pa[u]=get(pa[u]);
}
bool check(){for(int i=1;i<=m;i++){if(!e[i].c){e[i].d+=mid;}}sort(e+1,e+m+1,cmp);for(int i=1;i<=n;i++){fa[i]=i;}int cnt=0;for(int i=1,j=0;j<n-1;i++){int u=find(e[i].u),v=find(e[i].v);if(u!=v){fa[v]=u;j++;if(!e[i].c){cnt++;}}}for(int i=1;i<=m;i++){if(!e[i].c){e[i].d-=mid;}}return cnt>=k;
}
int fastpow(int a,int x){a%=mod;int res=1;while(x){if(x&1){res=res*a%mod;}x>>=1;a=a*a%mod;}return res;
}
int solve(int l,int r,int x){static int a[N][N];memset(a,0,sizeof(a));for(int i=l;i<=r;i++){int u=id[find(e[i].u)],v=id[find(e[i].v)];if(u==v){continue;}if(e[i].c){a[u][u]++;a[v][v]++;a[u][v]--;a[v][u]--;}else{a[u][u]+=x;a[v][v]+=x;a[u][v]-=x;a[v][u]-=x;}}memcpy(pa,fa,sizeof(fa));for(int i=2;i<=tot;i++){int u=get(num[i]),v=get(num[i-1]);if(u!=v){pa[v]=u;a[i][i]++;a[i-1][i-1]++;a[i][i-1]--;a[i-1][i]--;}}for(int i=1;i<=tot;i++){for(int j=1;j<=tot;j++){a[i][j]=(a[i][j]%mod+mod)%mod;}}int res=1;for(int i=1;i<tot;i++){for(int j=i+1;j<tot;j++){if(a[j][i]){int t=a[i][i]*fastpow(a[j][i],mod-2)%mod,tmp;for(int k=i;k<tot;k++){tmp=(a[i][k]-a[j][k]*t%mod+mod)%mod;a[i][k]=a[j][k];a[j][k]=tmp;}res=-res;}}}if(res==-1){res+=mod;}for(int i=1;i<tot;i++){res=res*a[i][i]%mod;}return res;
}
void lagerange(){static int a[N],b[N],c[N];memset(a,0,sizeof(a));memset(b,0,sizeof(b));memset(c,0,sizeof(c));memset(res,0,sizeof(res));a[0]=1;for(int i=0;i<=tot;i++){b[0]=0;for(int j=1;j<=i+1;j++){b[j]=a[j-1];}for(int j=0;j<=i;j++){b[j]=(b[j]-x[i]*a[j]%mod+mod)%mod;}for(int j=0;j<=i+1;j++){a[j]=b[j];}}for(int i=0;i<=tot;i++){for(int j=0;j<=tot+1;j++){b[j]=a[j];}for(int j=tot+1;j>=1;j--){c[j-1]=b[j];b[j-1]=(b[j-1]+1LL*b[j]*x[i]%mod)%mod;}int tmp=1;for(int j=0;j<=tot;j++){if(j!=i){tmp=tmp*(x[i]-x[j]+mod)%mod;}}tmp=y[i]*fastpow(tmp,mod-2)%mod;for(int j=0;j<=tot;j++){c[j]=c[j]*tmp%mod;res[j]=(res[j]+c[j])%mod;}}
}
signed main(){scanf("%lld%lld%lld",&n,&m,&k);for(int i=1;i<=m;i++){scanf("%lld%lld%lld%lld",&e[i].u,&e[i].v,&e[i].d,&e[i].c);}l=-1e9-1,r=1e9+1;while(l<r){mid=(l+r+1)/2;if(check()){l=mid;}else{r=mid-1;}}for(int i=1;i<=m;i++){if(!e[i].c){e[i].d+=l;}}sort(e+1,e+m+1,cmp);for(int i=1;i<=n;i++){fa[i]=i;}ans[0]=1;for(l=1;l<=m;l=r+1){r=l;while(r<m&&e[r+1].d==e[l].d){r++;}memset(id,0,sizeof(id));tot=0;for(int i=l;i<=r;i++){int u=find(e[i].u),v=find(e[i].v);if(u!=v){if(!id[u]){id[u]=++tot;num[tot]=u;}if(!id[v]){id[v]=++tot;num[tot]=v;}}}if(!tot||tot==1){continue;}memcpy(pa,fa,sizeof(fa));for(int i=l;i<=r;i++){int u=find(e[i].u),v=find(e[i].v);if(u!=v){fa[v]=u;}}for(int i=0;i<=tot;i++){x[i]=i+1;y[i]=solve(l,r,i+1);}lagerange();memset(tmp,0,sizeof(tmp));for(int i=0;i<n;i++){for(int j=0;i+j<n;j++){tmp[i+j]+=ans[i]*res[j]%mod;tmp[i+j]%=mod;}}memcpy(ans,tmp,sizeof(tmp));}for(int i=2;i<=n;i++){if(find(i)!=find(1)){puts("0");return 0;}}printf("%lld\n",ans[k]);return 0;
}

【XSY3163】Tree Ext【二分】【最小生成树】【矩阵树定理】【拉格朗日插值】相关推荐

  1. [XSY]Tree Ext(矩阵树定理,拉格朗日插值,最小生成树,二分)

    Tree Ext 这道题相当于把3道题合了起来. 要求修复的边中恰好有 k 条白边: 五颜六色的幻想乡(附拉格朗日插值法求多项式系数 ) + bzoj2654 tree(WQS二分 新科技get) 是 ...

  2. Wannafly挑战赛23F-计数【原根,矩阵树定理,拉格朗日插值】

    正题 题目链接:https://ac.nowcoder.com/acm/contest/161/F 题目大意 给出nnn个点的一张图,求它的所有生成树中权值和为kkk的倍数的个数.输出答案对ppp取模 ...

  3. 五颜六色的幻想乡 - 矩阵树定理 - 拉格朗日插值

    题目大意:给一张图,边有三种颜色,对于每一种可能的a+b+c=n-1的(a,b,c)问恰好a条红色边b条黄色c条蓝色边的方案数,n<=50,5s. 题解:朴素做法,红色视为x黄色视作y蓝色视作1 ...

  4. 最小生成树、矩阵树定理、Prufer序列总结

    Kruskal算法 按边权排序,从小到大合并不在同一集合两点即可 Prim算法 每次加入一个到当前已选点集最近的点 P2619 [国家集训队]Tree I 考虑二分,每次给白边加上一个mid,通过这种 ...

  5. BZOJ1016 || 洛谷P4208 [JSOI2008]最小生成树计数【矩阵树定理】

    时空限制 1000ms / 128MB 题目描述 现在给出了一个简单无向加权图.你不满足于求出这个图的最小生成树,而希望知道这个图中有多少个不同的最小生成树.(如果两颗最小生成树中至少有一条边不同,则 ...

  6. 矩阵树定理2020HDU多校第6场j-Expectation[位运算+期望]

    矩阵树定理 用于求解图上面生成树的个数,生成树的个数等于基尔霍夫矩阵的任何一个N-1阶主子式的行列式的绝对值 矩阵树模板 struct Matrix_Tree {ll a[N][N];Matrix_T ...

  7. 基尔霍夫(kirchhoff)矩阵树定理

    引入问题   给n个点m条边的图,求该图的最小生成树个数. 定理内容   我们对这个图构造两个矩阵,分别是这个图的连通矩阵和度数矩阵.连通矩阵S1S1S1的第iii行第jjj列上的数字表示原无向图中编 ...

  8. 行列式入门与矩阵树定理完整证明

    文章目录 前置技能 行列式 定义 性质 拉普拉斯展开 线性性 可乘性 可加性 不重性 可倍加性 转置不变性 可交换性 行可交换性 列可交换性 优化行列式的计算 矩阵树定理 前置定义 一些引理 转置引理 ...

  9. [meet in middle 矩阵树定理 容斥原理] SRM 551 div1 SweetFruits

    集训队论文传送门 大概就是我们先用meet in middle求出有恰好k个真甜的方案数 然后我们求这些东西的生成树个数 乘在一起的和就是答案 我们让真甜连真甜 真甜连不甜 假甜连不甜 不甜连不甜 跑 ...

  10. Luogu P4336 [SHOI2016]黑暗前的幻想乡(容斥,矩阵树定理,子集反演)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Luogu P4336 [SHOI2016]黑暗前的幻想乡(容斥,矩阵树定理) Problem n≤1 ...

最新文章

  1. 实现 Java 多线程并发控制框架
  2. 基于Servlet+JSP+JavaBean开发模式的用户登录注册
  3. git File name too long
  4. DHTML4(select与checkbox应用)
  5. 收发一体超声波测距离传感器模块_一文了解超声波液位计
  6. java手机震动_Windows Phone 7 开发 之使手机震动
  7. (一)apache atlas源代码编译与打包
  8. c++除法保留小数_BigDecimal 加减乘除、保留小位数
  9. java 模板转PDF(合同)详细讲解
  10. phpnow升级mysql_PHPnow更新PHP版本后连接数据库错误(mysql_connect报错)
  11. 百度 android 市场占有率,2019百度 排行榜_2019安卓应用市场排行榜Top10
  12. neo4j安装算法插件-GDS
  13. 群同态和群同构的区别_同构和同态有什么区别,它们可以用在哪些方面?
  14. php使用phpword教程,使用PHPWord生成word文档
  15. c语言输出五角星程序,c语言入门之绘制五角星.doc
  16. ffmpeg 视频裁剪格式问题
  17. 小学计算机老师师德师风演讲稿,小学教师师德师风的演讲稿(精选5篇)
  18. 小保养多,大保养少 别克英朗保养详解
  19. android防拆机方案,拆机狂人必备 iFixit Android客户端试用
  20. 苦涩又难懂的io<3>

热门文章

  1. 什么是 SAML 断言?
  2. 订阅Linux的邮件列表
  3. 7.JavaScript异步加载与加载时间线
  4. Button的学习教程
  5. react之withRouter的作用
  6. 飘窗的窗帘靠窗还是靠墙?-好佳居窗帘十大品牌
  7. 详细了解JS中三目运算
  8. JVM命令行监控工具之jhat(Java Heap Analysis Tool)
  9. 【路径规划】基于matlab灰狼算法机器人栅格地图最短路径规划【含Matlab源码 1761期】
  10. leetcode.121. 买卖股票的最佳时机(best-time-to-buy-and-sell-stock)