博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[JSOI2008]最小生成树计数
阅读量:5032 次
发布时间:2019-06-12

本文共 1091 字,大约阅读时间需要 3 分钟。

题意

求一张图不同的的最小生成树个数,对31011取模,满足\(n\leq 100,m\leq 1000,w\leq 1e9\) 且每种边权的边数不超过10

思路

定理:对于不同的最小生成树方案,相同边权的边数不变

证明():假设比当前权值小的边都选择完了(不一定加进了最小生成树),那么当前权值为\(w\)的边一定要尽量的选,合并越多连通块越好。于是假设将当前权值的所有边加入可以合并\(k\)次连通块,由于有没有用的边存在,我们会将它们删掉,但仍然一定会保证这\(k\)次连通块合并仍然存在(前面说的加边越多越好),由于选择一条边即表示合并一次连通块,所以会选择\(k\)条边,显然这是一个定值

备注:其实从上面的证明中容易发现,\(k\)条边的每一种合理选择方案所影响的连通块状态应该是一致的(只要有一种方案使得\(a\)\(b\)相连,即使其他方案选择的边不同,也都会使\(a\)\(b\)相连)

法一:暴力枚举

于是,我们求出最小生成树中有权值相同的边的个数,对于每一种权值,我们对其进行dfs,找到k条有用的边,这样算作一种方案,由于权值相同的边不会超过10,所以复杂度不超过\(2^{10}\)

时间复杂度为\(O(2^{10}m)\)

Code

#include
#define N 1005using namespace std;const int mod = 31011;int n,m,fa[N];struct E {int u,v,w;} e[N];struct Rgb {int l,r,v;} rgb[N];int cnt,ans=1,sum,tot;template
void read(T &x){ char c;int sign=1; while((c=getchar())>'9'||c<'0') if(c=='-') sign=-1; x=c-48; while((c=getchar())>='0'&&c<='9') x=x*10+c-48; x*=sign;}bool cmp(E a,E b) {return a.w

法二:矩阵树定理

不会,留坑

矩阵树定理可以\((n^3)\)统计无向连通图的生成树个数

大概意思就是枚举边权i,将除了边权i之外的所有边全部加入图中,然后缩点,用矩阵树定理即可统计边权i的选择方案数,最后同样乘起来即可(口胡)

转载于:https://www.cnblogs.com/Chtholly/p/11426256.html

你可能感兴趣的文章
CF717A Festival Organization(第一类斯特林数,斐波那契数列)
查看>>
oracle直接读写ms sqlserver数据库(二)配置透明网关
查看>>
控件发布:div2dropdownlist(div模拟dropdownlist控件)
查看>>
Oracle composite index column ordering
查看>>
ActiveReports 报表控件官方中文入门教程 (3)-如何选择页面报表和区域报表
查看>>
kaggle竞赛
查看>>
区块链入门教程
查看>>
域 搭建OU 组织单元
查看>>
npm常用命令
查看>>
南海区行政审批管理系统接口规范v0.3(规划)4.2.【queryExpireList】当天到期业务查询...
查看>>
[置顶] 细说Cookies
查看>>
[wp7软件]wp7~~新闻资讯,阅读软件下载大全! 集合贴~~~
查看>>
生成指定位数随机数的方法
查看>>
java的垃圾回收
查看>>
Essential C++学习笔记
查看>>
python+selenium进行简单验证码获取
查看>>
where,having与 group by连用的区别
查看>>
【MySQL】MySQL锁和隔离级别浅析二 之 INSERT
查看>>
Oracle T4-2 使用ILOM CLI升级Firmware
查看>>
4.14上午
查看>>