【题目链接】

点击打开链接

【算法】

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

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. [Python3网络爬虫开发实战] 6.1-什么是Ajax

    Ajax,全称为Asynchronous JavaScript and XML,即异步的JavaScript和XML.它不是一门编程语言,而是利用JavaScript在保证页面不被刷新.页面链接不改变 ...

  2. linux下硬盘分区、格式化以及文件管理系统

    1.添加虚拟硬盘 (1)点击编辑虚拟机位置,然后点击添加   (2)点击添加硬盘 (3)点击下一步 (4)创建新虚拟磁盘并点击下一步 (5)指定磁盘容量并且点击下一步 (6)点击完成 2.系统分区 当 ...

  3. 一种RC滤波电路的验证

    在做电源的时候,在开关管的D极经常是出现不想看到的尖峰脉冲.以CCFL推挽式缓冲电路为准,我与一个同学杨进行了相应的验证. 其中的出来的现象和反思如下: 1,加上电阻和电容串联的滤波的确能将尖峰脉冲消 ...

  4. CodeForces 221D Little Elephant and Array

    Little Elephant and Array Time Limit: 4000ms Memory Limit: 262144KB This problem will be judged on C ...

  5. 添物不花钱学JavaEE(基础篇)- Tomcat

    Tomcat是大家常用的Java Web容器. 添物网使用的也是Tomcat. 官方网址: http://tomcat.apache.org/ 官方文档看看. 可以看的图书 <Tomcat权威指 ...

  6. poj 1456

    #include<stdio.h> #include<string.h> #include<stdlib.h> #define N 10010 #define in ...

  7. .net如何统计在线人数

    原文发布时间为:2008-10-17 -- 来源于本人的百度文章 [由搬家工具导入] 统计在线用户的作用不言而喻,就是为了网站管理者可以知道当前用户的多少,然后根据用户数量来观察服务器或者程序的性能, ...

  8. POJ 1804 逆序对数量 / 归并排序

    Brainman Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 12175   Accepted: 6147 Descrip ...

  9. MongoDB小结23 - 索引简介

    MongoDB中的索引,可以看作是书的目录. 想象一下给你一本没有目录的书,然后让你去查询指定内容,我只想说,我不是电脑,我很蛋疼! 让你翻没有目录的书,就跟让电脑查询没有索引的集合一样,从头查询到尾 ...

  10. uva 1411 Ants (权值和最小的完美匹配---KM算法)

    uva 1411 Ants Description Young naturalist Bill studies ants in school. His ants feed on plant-louse ...