【题目链接】

点击打开链接

【算法】

笔者做这题参考了这篇博客 :

https://blog.sengxian.com/solutions/bzoj-1016

推荐阅读

首先,我们需要知道三个定理 :

定理1 : 若A,B是两棵不同的最小生成树,它们的权值从小到大排列分别为 :

                        W(a1),W(a2),W(a3)....W(an-1)

                        W(b1),W(b2),W(b3)....W(bn-1)

                        那么,对于任意的i,都有W(ai) = W(bi)

          定理2 : 当最小生成树中所有w <= w0的边被加入后,图的联通性唯一

          定理3 : 若A是一棵最小生成树,A中权值为v的边有k条,那么,用任意k条权值为v的边替换A中权值为v的边且不产生

                        环的方案都是一棵最小生成树

         证明详见笔者推荐的那篇博客

有了这三个定理,这题就很好做啦! 首先,任意求一棵最小生成树,记录每种权值的边出现的次数,然后,对每种

权值的边做一遍深度优先搜索DFS,求出方案数,然后乘法原理,即可

【代码】

注意因为进行DFS时需要回溯,所以,并查集不能路径压缩

#include<bits/stdc++.h>
using namespace std;
#define MAXN 110
#define MAXM 1010
const int MOD = ; int n,m,i,j,ans = ,pos,len,sum,sx,sy;
int fa[MAXN],s[MAXN],val[MAXN],l[MAXN],r[MAXN]; struct Edge
{
int u,v,w;
} e[MAXM];
inline void init(int n)
{
int i;
for (i = ; i <= n; i++) fa[i] = i;
}
int get_root(int x)
{
if (fa[x] == x) return x;
return get_root(fa[x]);
} bool cmp(Edge a,Edge b)
{
return a.w < b.w;
}
bool kruskal()
{
int i,cnt = ,sx,sy;
for (i = ; i <= m; i++)
{
sx = get_root(e[i].u);
sy = get_root(e[i].v);
if (e[i].w == val[len]) r[len]++;
if (sx != sy)
{
fa[sx] = sy;
cnt++;
if (e[i].w == val[len]) s[len]++;
else
{
len++;
l[len] = r[len] = i;
s[len]++;
val[len] = e[i].w;
}
}
}
return cnt == n - ;
}
inline void dfs(int now,int r,int c)
{
int sx,sy;
if (now > r)
{
if (c == s[pos]) sum++;
return;
}
dfs(now+,r,c);
sx = get_root(e[now].u);
sy = get_root(e[now].v);
if (sx != sy)
{
fa[sx] = sy;
dfs(now+,r,c+);
fa[sx] = sx;
}
} int main() { scanf("%d%d",&n,&m);
for (i = ; i <= m; i++) scanf("%d%d%d",&e[i].u,&e[i].v,&e[i].w);
sort(e+,e+m+,cmp);
init(n);
if (!kruskal())
{
puts("");
return ;
}
init(n);
for (i = ; i <= len; i++)
{
sum = ;
pos = i;
dfs(l[i],r[i],);
ans = (ans * sum) % MOD;
for (j = l[i]; j <= r[i]; j++)
{
sx = get_root(e[j].u);
sy = get_root(e[j].v);
if (sx != sy) fa[sx] = sy;
}
}
printf("%d\n",ans); return ; }

【JSOI 2008】 最小生成树计数的更多相关文章

  1. JSOI 2008 最小生成树计数

    JSOI 2008 最小生成树计数 今天的题目终于良心一点辣 一个套路+模版题. 考虑昨天讲的那几个结论,我们有当我们只保留最小生成树中权值不超过 $ k $ 的边的时候形成的联通块是一定的. 我们可 ...

  2. BZOJ 1016 JSOI 2008 最小生成树计数 Kruskal+搜索

    题目大意:给出一些边,求出一共能形成多少个最小生成树. 思路:最小生成树有非常多定理啊,我也不是非常明确.这里仅仅简单讲讲做法.关于定各种定理请看这里:http://blog.csdn.net/wyf ...

  3. 最小生成树计数 bzoj 1016

    最小生成树计数 (1s 128M) award [问题描述] 现在给出了一个简单无向加权图.你不满足于求出这个图的最小生成树,而希望知道这个图中有多少个不同的最小生成树.(如果两颗最小生成树中至少有一 ...

  4. 【bzoj1016】 JSOI2008—最小生成树计数

    http://www.lydsy.com/JudgeOnline/problem.php?id=1016 (题目链接) 题意 求图的最小生成树计数. Solution %了下题解,发现要写矩阵树,15 ...

  5. [BZOJ]1016 JSOI2008 最小生成树计数

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

  6. bzoj1016 [JSOI2008]最小生成树计数

    1016: [JSOI2008]最小生成树计数 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 3517  Solved: 1396[Submit][St ...

  7. 【BZOJ】【1016】【JSOI2008】最小生成树计数

    Kruskal/并查集+枚举 唉我还是too naive,orz Hzwer 一开始我是想:最小生成树删掉一条边,再加上一条边仍是最小生成树,那么这两条边权值必须相等,但我也可以去掉两条权值为1和3的 ...

  8. 【BZOJ】1016: [JSOI2008]最小生成树计数 深搜+并查集

    最小生成树计数 Description 现在给出了一个简单无向加权图.你不满足于求出这个图的最小生成树,而希望知道这个图中有多少个不同的最小生成树.(如果两颗最小生成树中至少有一条边不同,则这两个最小 ...

  9. BZOJ_1016_[JSOI2008]_最小生成树计数_(dfs+乘法原理)

    描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1016 给出一张图,其中具有相同权值的边的数目不超过10,求最小生成树的个数. 分析 生成树的计 ...

  10. BZOJ 1016: [JSOI2008]最小生成树计数( kruskal + dfs )

    不同最小生成树中权值相同的边数量是一定的, 而且他们对连通性的贡献是一样的.对权值相同的边放在一起(至多10), 暴搜他们有多少种方案, 然后乘法原理. ----------------------- ...

随机推荐

  1. 配置Django中数据库读写分离

    django在进行数据库操作的时候,读取数据与写数据(曾.删.改)可以分别从不同的数据库进行操作 修改配置文件: DATABASES = { 'default': { 'ENGINE': 'djang ...

  2. 【笔记】搭建OpenWrt编译环境

    参考书目<B智能路由开发指南> 目标:搭建一个OpenWrt编译环境,可以同时在家里和公司使用. [2018-09-13] 刚开始想用自己的电脑共享远程桌面,但不知道什么原因搞不定,所以干 ...

  3. Linux一键安装web环境全攻略phpstudy版

    此教程主要是应对阿里云Linux云服务器ecs的web环境安装,理论上不限于阿里云服务器,此教程对所有Linux云服务器都具有参考价值. 写这篇文章的目的:网上有很多关于Linux一键安装web环境全 ...

  4. 树莓派 - platform总线,设备和驱动

    以树莓派为例子,分析一下其中LED的 platform device 和 platform driver. 查看LED设备,被挂载在/sys/devices/platform下. 注意其中的drive ...

  5. Python Pandas库的学习(二)

    今天我们继续讲下Python中一款数据分析很好的库.Pandas的学习 接着上回讲到的,如果有人听不懂,麻烦去翻阅一下我前面讲到的Pandas学习(一) 如果我们在数据中,想去3,4,5这几行数据,那 ...

  6. stark组件之注册与路由系统(三)

    在文章stark组件前戏中已经提到过,django的注册功能是通过AdminSite的单例进行组册的,所以在这里也可以进行单例模式. class AdminSite(object): def __in ...

  7. (九)python3 列表生成式

    列表生成式即 List Comprehensions,是 Python 内置的非常简单却强大的可以用来创建 list 的生成式. 要生成 list [1, 2, 3, 4, 5, 6, 7, 8, 9 ...

  8. 一个ajax实例

    一个ajax实例   html   <!DOCTYPE html> <html lang="zh-cn"> <head> <meta ch ...

  9. [OJ#40]后宫佳丽

    [OJ#40]后宫佳丽 试题描述 如果机房要关门了,或者有妹子在等你,你可以直接看最后一句话. Fyq 是一只饥渴的鸭子. Fyq 有一个充实的后宫,可惜他总是体力不支,为此他经常苦恼,总是想方设法让 ...

  10. msp430入门学习12

    msp430的定时器--Timer_A(定时器A) msp430入门学习