BZOJ 1016 最小生成树计数 【模板】最小生成树计数
【题解】
对于不同的最小生成树,每种权值的边使用的数量是一定的,每种权值的边的作用是确定的
我们可以先做一遍Kruskal,求出每种权值的边的使用数量num
再对于每种权值的边,2^num搜索出合法使用方案,把每种权值的边的方案用乘法原理乘起来就是答案了
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=,Mod=;
int n,m,tot,sum,ans=,cnt,st[maxn],fa[maxn],num[maxn];
struct edge{int x,y,dis,pos;}e[maxn];
void read(int &k){
k=; int f=; char c=getchar();
while(c<''||c>'')c=='-'&&(f=-),c=getchar();
while(''<=c&&c<='')k=k*+c-'',c=getchar();
k*=f;
}
int find(int x){return fa[x]==x?x:find(fa[x]);}
void dfs(int kind,int now,int chosen){
if (now==st[kind+]){
if (chosen==num[kind]) sum++;
return;
}
int p=find(e[now].x),q=find(e[now].y);
if (p!=q) fa[p]=q,dfs(kind,now+,chosen+),fa[p]=p,fa[q]=q;
dfs(kind,now+,chosen);
}
bool cmp(edge a,edge b){return a.dis<b.dis;}
int main(){
read(n); read(m);
for (int i=;i<=m;i++)read(e[i].x),read(e[i].y),read(e[i].dis);
sort(e+,e+m+,cmp);
for (int i=;i<=m;i++) {
if (e[i].dis!=e[i-].dis) st[++cnt]=i;
e[i].pos=cnt;
}
st[cnt+]=m+;
for (int i=;i<=n;i++) fa[i]=i;
for (int i=,x,y;i<=m;i++)
if ((x=find(e[i].x))!=(y=find(e[i].y))) fa[x]=y,num[e[i].pos]++,tot++;
if (tot!=n-) return puts(""),;
for (int i=;i<=n;i++) fa[i]=i;
for (int i=;i<=cnt;i++) if(num[i]){
sum=; dfs(i,st[i],);
for (int j=st[i];j<st[i+];j++) fa[find(e[j].x)]=find(e[j].y);
ans=1LL*ans*sum%Mod;
}
printf("%d",ans);
return ;
}
BZOJ 1016 最小生成树计数 【模板】最小生成树计数的更多相关文章
- BZOJ 1016 【JSOI2008】 最小生成树计数
Description 现在给出了一个简单无向加权图.你不满足于求出这个图的最小生成树,而希望知道这个图中有多少个不同的最小生成树.(如果两颗最小生成树中至少有一条边不同,则这两个最小生成树就是不同的 ...
- [BZOJ 1016] [JSOI2008] 最小生成树计数 【DFS】
题目链接:BZOJ - 1016 题目分析 最小生成树的两个性质: 同一个图的最小生成树,满足: 1)同一种权值的边的个数相等 2)用Kruscal按照从小到大,处理完某一种权值的所有边后,图的连通性 ...
- luoguP3366 [模板] 最小生成树
题目链接:https://www.luogu.org/problemnew/show/P3366 思路: 求最小生成树的模板题,求MST有两种算法——Prim.Kruskal. 两者区别:Prim在稠 ...
- BZOJ 1016: [JSOI2008]最小生成树计数( kruskal + dfs )
不同最小生成树中权值相同的边数量是一定的, 而且他们对连通性的贡献是一样的.对权值相同的边放在一起(至多10), 暴搜他们有多少种方案, 然后乘法原理. ----------------------- ...
- 最小生成树的边的概念问题!!! 最小生成树的计数 bzoj 1016
1016: [JSOI2008]最小生成树计数 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 5292 Solved: 2163[Submit][St ...
- 【BZOJ 1016】 1016: [JSOI2008]最小生成树计数 (DFS|矩阵树定理)
1016: [JSOI2008]最小生成树计数 Description 现在给出了一个简单无向加权图.你不满足于求出这个图的最小生成树,而希望知道这个图中有多少个不同的最小生成树.(如果两颗最小生成树 ...
- 最小生成树计数 bzoj 1016
最小生成树计数 (1s 128M) award [问题描述] 现在给出了一个简单无向加权图.你不满足于求出这个图的最小生成树,而希望知道这个图中有多少个不同的最小生成树.(如果两颗最小生成树中至少有一 ...
- [BZOJ]1016 JSOI2008 最小生成树计数
最小生成树计数 题目描述 现在给出了一个简单无向加权图.你不满足于求出这个图的最小生成树,而希望知道这个图中有多少个不同的最小生成树.(如果两颗最小生成树中至少有一条边不同,则这两个最小生成树就是不同 ...
- BZOJ.1016.[JSOI2008]最小生成树计数(Matrix Tree定理 Kruskal)
题目链接 最小生成树有两个性质: 1.在不同的MST中某种权值的边出现的次数是一定的. 2.在不同的MST中,连接完某种权值的边后,形成的连通块的状态是一样的. \(Solution1\) 由这两个性 ...
随机推荐
- 我的Android进阶之旅------>Android中MediaRecorder.stop()报错 java.lang.RuntimeException: stop failed.【转】
本文转载自:http://blog.csdn.net/ouyang_peng/article/details/48048975 今天在调用MediaRecorder.stop(),报错了,java.l ...
- 【POI 2010】 Antisymmetry
[题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=2084 [算法] manacher [代码] #include<bits/std ...
- B1297 [SCOI2009]迷路 矩阵
这个题我觉得很有必要写一篇博客.首先,我们需要知道,假如一个邻接矩阵只有0/1构成,那么它自己的n次方就是走n步之后的方案数.但这个题还有2~9咋办呢.我们观察发现,这个题只有10个点,而且边权< ...
- PCB 内层负片散热PAD Symbols尺寸更改方法
如下图这是我们熟悉的内层负片散热PAD Symbols,我们CAM制作时,为了满足PCB工厂生产制作能力,,会优化散热PAD尺寸,让热PAD的尺寸符合制作规范要求,通常我们只关注散热PAD的3个指标即 ...
- LDA PCA 学习笔记
提要: 本文主要介绍了和推导了LDA和PCA,参考了这篇博客 LDA LDA的原理是,将带上标签的数据(点),通过投影的方法,投影到维度更低的空间中,使得投影后的点,会形成按类别区分,一簇一簇的情况, ...
- 【Leetcode 166】 Fraction to Recurring Decimal
Description: Given two integers representing the numerator and denominator of a fraction, return the ...
- Laravel 5.4.36 session 生效问题
在测试过程中发现 如果方法有echo 等函数输出到PHP的输出缓存中 存在 sessionID 不会放到http的请求头中 下次请求也就拿不到sessionid问题 问题的原因 代码位置:publ ...
- 用CSS样式写选择框右侧小三角
直接上代码! <!DOCTYPE html><html lang="en"><head> <title>小三角</title& ...
- 把多种验证规则用到一个model上
基于标记特性的Model验证,真的太棒了,与jquery validate结合后激情四射,有木有,一句话完成前后端验证.简直让人秒爱... 但是爱是爱了,生活中总会有些小摩擦,这不问题来了:看图中那个 ...
- JavaWeb项目中引入spring框架
主要步骤有以下3步: 1:下载spring的jar包2:在项目中web.xml中添加spring配置3:bean配置文件-applicationContext.xml 1:引入包,这个就不说了,官网下 ...