博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
洛谷4208 JSOI2008最小生成树计数(矩阵树定理+高斯消元)
阅读量:5143 次
发布时间:2019-06-13

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

qwq

这个题目真的是很好的一个题啊

qwq

其实一开始想这个题,肯定是无从下手。

首先,我们会发现,对于无向图的一个最小生成树来说,只有当存在一些边与内部的某些边权值相同的时候且能等效替代的时候,才会有多种最小生成树。

那我们不妨对于原图先随意求一个最小生成树,然后对于出现在最小生成树上的每个权值计算贡献。

我们每次删除所有该权值的边,然后把剩下的点能缩点的进行缩点(用并查集来维护)

然后,我们构造一个联通块的拉普拉斯矩阵。也就是说,加入所有的在图中的,权值为该值的边。然后我们只需要求能重新构成生成树的连接方式。

(这里重边要当成不同的边来算!!因为表示的方案并不相同)

那么我们考虑对于当前权值的边的一个合法的连接,是要求能将所有的联通块变成一个树。

换句话说,对于每一条边,他的合法连接方式数量,就是这个图的生成树个数。

假设每个权值的合法连接方式是\(f[i]\)

那么最终的\[ans=\prod_{i \in tree} f[i]\]

#include
#include
#include
#include
#include
#include
#include
#include
#define mk make_pair#define ll long long#define int long long#include
using namespace std;inline int read(){ int x=0,f=1;char ch=getchar(); while (!isdigit(ch)) {if (ch=='-') f=-1;ch=getchar();} while (isdigit(ch)) {x=(x<<1)+(x<<3)+ch-'0';ch=getchar();} return x*f;}const int maxn = 510;const int mod = 31011;const int maxm = 1e5+1e2;struct Edge{ int u,v,w;};Edge e[maxm];int tag[maxm];int n,m;int ans=1;vector
v;int fa[maxn];int vis[maxm];int a[maxn][maxn];Edge now[maxm];int sum;bool cmp(Edge a,Edge b){ return a.w

转载于:https://www.cnblogs.com/yimmortal/p/10158855.html

你可能感兴趣的文章
【常用算法总结——树状数组】
查看>>
地图漫游~
查看>>
设计模式之简易工厂模式
查看>>
通过XmlSerializer 实现XML的序列化与反序列化
查看>>
根据对象的某一属性对数组进行排序
查看>>
SSH
查看>>
leetcode 19.删除链表的第n个节点
查看>>
wps操作记录
查看>>
Java 实例 数组之间的相乘,并计算数组的长度
查看>>
Javascript闭包(Closure)
查看>>
这个表明将http协议转成websocket协议
查看>>
关于堆栈的讲解(一)
查看>>
拓展中国剩余定理(不互质的情况)
查看>>
C# ASP.NET 读取EXCEL 单元格 读取 空值 不显示
查看>>
R语言学习-sep和rep
查看>>
PLC串口通讯时报运算错误
查看>>
joomla
查看>>
LeetCode——Longest Consecutive Sequence
查看>>
网页只能在微信内置浏览器中访问
查看>>
Windows Phone 7 优秀开源项目收集
查看>>