bzoj1016/luogu4208 最小生成树计数 (kruskal+暴搜)
由于有相同权值的边不超过10条的限制,所以可以暴搜
先做一遍kruskal,记录下来每个权值的边使用的数量(可以离散化一下)
可以证明,对于每个权值,所有的最小生成树中选择的数量是一样的、而且它们连成的连通块也是一样的
所以我们把每个权值的边分开暴搜所有可能的情况,最后再乘到一起就是答案
#include<bits/stdc++.h>
#define pa pair<int,int>
#define CLR(a,x) memset(a,x,sizeof(a))
using namespace std;
typedef long long ll;
const int maxn=,maxm=,P=; inline ll rd(){
ll x=;char c=getchar();int neg=;
while(c<''||c>''){if(c=='-') neg=-;c=getchar();}
while(c>=''&&c<='') x=x*+c-'',c=getchar();
return x*neg;
} struct Edge{
int a,b;
ll l;
}eg[maxm];
int egh[maxn],ect;
int N,M,L,cnt[maxm];
int fa[maxn],ans,sum; inline bool cmp(Edge a,Edge b){return a.l<b.l;}
inline int getf(int x){
while(x!=fa[x]) x=fa[x];return x;
} void dfs(int x,int y,int n){
if(x>M||eg[x].l!=y){
if(n==cnt[y]) sum=(sum+)%P;
return;
}
int aa=getf(eg[x].a),bb=getf(eg[x].b);
if(aa!=bb){
fa[aa]=bb;
dfs(x+,y,n+);
fa[aa]=aa;
}
dfs(x+,y,n);
} int main(){
//freopen("","r",stdin);
int i,j,k;
N=rd(),M=rd();
for(i=;i<=M;i++){
eg[i].a=rd(),eg[i].b=rd();
eg[i].l=rd();
}sort(eg+,eg+M+,cmp);
int lst=-;
for(i=,j=;i<=M;i++){
if(eg[i].l!=lst) j++;
lst=eg[i].l,eg[i].l=j;
}
for(i=;i<=N;i++) fa[i]=i;
for(i=,j=;i<=M;i++){
int x=getf(eg[i].a),y=getf(eg[i].b);
if(x!=y){
fa[x]=y;
j++;cnt[eg[i].l]++;
}
}
if(j<N-){printf("0\n");return ;}
for(i=;i<=N;i++) fa[i]=i;
int ans=;
for(i=,j=;i<=M;i++){
if(eg[i].l!=eg[i-].l){
sum=;dfs(i,eg[i].l,);
ans=(ans*sum)%P;
}
int x=getf(eg[i].a),y=getf(eg[i].b);
if(x!=y){
fa[x]=y;j++;
}
}
printf("%d\n",ans);
return ;
}
bzoj1016/luogu4208 最小生成树计数 (kruskal+暴搜)的更多相关文章
- bzoj1016: [JSOI2008]最小生成树计数(kruskal+dfs)
1016: [JSOI2008]最小生成树计数 题目:传送门 题解: 神题神题%%% 据说最小生成树有两个神奇的定理: 1.权值相等的边在不同方案数中边数相等 就是说如果一种方案中权值为1的边有n条 ...
- [bzoj1016][JSOI2008]最小生成树计数 (Kruskal + Matrix Tree 定理)
Description 现在给出了一个简单无向加权图.你不满足于求出这个图的最小生成树,而希望知道这个图中有多少个不同的最小生成树.(如果两颗最小生成树中至少有一条边不同,则这两个最小生成树就是不同的 ...
- [BZOJ1016] [JSOI2008] 最小生成树计数 (Kruskal)
Description 现在给出了一个简单无向加权图.你不满足于求出这个图的最小生成树,而希望知道这个图中有多少个不同的最小生成树.(如果两颗最小生成树中至少有一条边不同,则这两个最小生成树就是不同的 ...
- bzoj1016 [JSOI2008]最小生成树计数——Kruskal+矩阵树定理
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1016 从 Kruskal 算法的过程来考虑产生多种方案的原因,就是边权相同的边有一样的功能, ...
- bzoj1016: [JSOI2008]最小生成树计数(kruskal+dfs)
一直以为这题要martix-tree,实际上因为有相同权值的边不大于10条于是dfs就好了... 先用kruskal求出每种权值的边要选的次数num,然后对于每种权值的边2^num暴搜一下选择的情况算 ...
- BZOJ 1016: [JSOI2008]最小生成树计数( kruskal + dfs )
不同最小生成树中权值相同的边数量是一定的, 而且他们对连通性的贡献是一样的.对权值相同的边放在一起(至多10), 暴搜他们有多少种方案, 然后乘法原理. ----------------------- ...
- bzoj1016 [JSOI2008]最小生成树计数
1016: [JSOI2008]最小生成树计数 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 3517 Solved: 1396[Submit][St ...
- 【kruscal】【最小生成树】【搜索】bzoj1016 [JSOI2008]最小生成树计数
不用Matrix-tree定理什么的,一边kruscal一边 对权值相同的边 暴搜即可.将所有方案乘起来. #include<cstdio> #include<algorithm&g ...
- [BZOJ1016][JSOI2008]最小生成树计数(结论题)
题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1016 分析: 首先有个性质:如果边集E.E'都可以表示一个图G的最小生成树(当然E和E ...
随机推荐
- Trusted Cloud Summit(2018.08.14)
时间:2018.08.14地点:北京国际会议中心
- 实验的方差分析(R语言)
实验设计与数据处理(大数据分析B中也用到F分布,故总结一下,加深印象)第3课小结--实验的方差分析(one-way analysis of variance) 概述 实验结果\(S\)受多个因素\(A ...
- 解决debug到jdk源码时不能查看变量值的问题
目录 如何跟踪jdk源码 1. 编译源码 2. 关联源码 3. 大功告成 如何跟踪jdk源码 看到这个标题大概大家都会在心里想谁还跟踪个源码呀,在eclipse中打个断点,以debug的方式运行,然后 ...
- 解决 引入本地jar包后 maven无法编译的问题及部署war包缺失本地jar包的问题
参考:https://blog.csdn.net/wang864676212/article/details/82626922 pom.xml 引入 <plugin> <plugin ...
- maven核心,pom.xml详解
什么是pom? pom作为项目对象模型.通过xml表示maven项目,使用pom.xml来实现.主要描述了项目:包括配置文件:开发者需要遵循的规则,缺陷管理系统,组织和licenses,项目的u ...
- Spring+SpringMVC+MyBatis整合优化篇
优化篇 Spring+SpringMVC+MyBatis+easyUI整合优化篇(一)System.out.print与Log Spring+SpringMVC+MyBatis+easyUI整合优化篇 ...
- allegro对齐操作
在placement edit模式下 选中元件,右键对齐即可.
- 修炼内功_day01
测试六段: 测试第一段: - 能根据测试用例的描述步骤来执行用例 - 能对照用例的预期结果发现产品的问题 - 能够清晰准确的将问题记录下来后反馈给开发, ...
- leetcode之有序数组的平方
题目描述: 给定一个按非递减顺序排序的整数数组 A,返回每个数字的平方组成的新数组,要求也按非递减顺序排序. 示例 1: 输入:[-4,-1,0,3,10] 输出:[0,1,9,16,100] 示例 ...
- think in UML(二)
基础篇——在学习中思考! 在大概了解了UML之后就该系统的学习UML的主要建模元素了,一个个实例帮助我们更好的理解这些元素的重要性并运用相关知识解决实际问题. 在UML里有一个概念叫版型,有些书里也称 ...