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

-------------------------------------------------------------------------------------

#include<cstdio>
#include<cstring>
#include<algorithm>
 
using namespace std;
 
const int MAXN = 109;
const int MAXM = 1009;
const int MOD = 31011;
 
struct edge {
int u, v, w;
bool operator < (const edge &e) const {
return w < e.w;
}
} E[MAXM];
 
int N, M, L, R, p_c, fa_c, tot, ans = 1;
int h[MAXN], cnt[MAXN], n;
int p[MAXN], fa[MAXN], par[MAXN];
bool chosen[MAXM];
 
int Find(int par[], int x) {
return x == par[x] ? x : par[x] = Find(par, par[x]);
}
 
inline void InitDsu(int par[]) {
for(int i = 0; i < N; i++) par[i] = i;
}
 
void Init() {
scanf("%d%d", &N, &M);
for(int i = 0; i < M; i++) {
scanf("%d%d%d", &E[i].u, &E[i].v, &E[i].w);
E[i].u--; E[i].v--;
}
sort(E, E + M);
h[0] = E[0].w;
n = 1;
for(int i = 1; i < M; i++)
if(E[i].w != E[i - 1].w) h[n++] = E[i].w;
h[n] = -1;
}
 
void Dfs(int x, int c) {
if(!c) {
memcpy(fa, par, sizeof fa);
int Delta = 0;
for(int i = L; i < x; i++) if(chosen[i]) {
int u = Find(fa, E[i].u), v = Find(fa, E[i].v);
if(u != v)
Delta++, fa[u] = v;
}
if(Delta + p_c == fa_c) tot++;
return;
}
if(x >= R) return;
chosen[x] = true; Dfs(x + 1, c - 1);
chosen[x] = false; Dfs(x + 1, c);
}
 
int main() {
Init();
InitDsu(p);
for(int i = 0; i < M; i++) {
int u = Find(p, E[i].u), v = Find(p, E[i].v);
if(u != v)
p[u] = v;
}
for(int i = 1; i < N; i++) if(Find(p, i) != Find(p, i - 1)) {
puts("0"); return 0;
}
memset(chosen, 0, sizeof chosen);
InitDsu(p);
p_c = N; R = 0;
for(int i = 0; i < n; i++) {
for(L = R; E[L].w == E[R].w; R++);
int cnt = 0;
fa_c = p_c;
memcpy(par, p, sizeof p);
for(int j = L; j < R; j++) {
int u = Find(p, E[j].u), v = Find(p, E[j].v);
if(u != v)
p[u] = v, p_c--, cnt++;
}
tot = 0;
Dfs(L, cnt);
(ans *= tot) %= MOD;
}
printf("%d\n", ans);
return 0;
}

-------------------------------------------------------------------------------------

1016: [JSOI2008]最小生成树计数

Time Limit: 1 Sec  Memory Limit: 162 MB
Submit: 3916  Solved: 1557
[Submit][Status][Discuss]

Description

现在给出了一个简单无向加权图。你不满足于求出这个图的最小生成树,而希望知道这个图中有多少个不同的最小生成树。(如果两颗最小生成树中至少有一条边不同,则这两个最小生成树就是不同的)。由于不同的最小生成树可能很多,所以你只需要输出方案数对31011的模就可以了。

Input

第一行包含两个数,n和m,其中1<=n<=100; 1<=m<=1000; 表示该无向图的节点数和边数。每个节点用1~n的整数编号。接下来的m行,每行包含两个整数:a, b, c,表示节点a, b之间的边的权值为c,其中1<=c<=1,000,000,000。数据保证不会出现自回边和重边。注意:具有相同权值的边不会超过10条。

Output

输出不同的最小生成树有多少个。你只需要输出数量对31011的模就可以了。

Sample Input

4 6
1 2 1
1 3 1
1 4 1
2 3 2
2 4 1
3 4 1

Sample Output

8

HINT

Source

BZOJ 1016: [JSOI2008]最小生成树计数( kruskal + dfs )的更多相关文章

  1. [BZOJ 1016] [JSOI2008] 最小生成树计数 【DFS】

    题目链接:BZOJ - 1016 题目分析 最小生成树的两个性质: 同一个图的最小生成树,满足: 1)同一种权值的边的个数相等 2)用Kruscal按照从小到大,处理完某一种权值的所有边后,图的连通性 ...

  2. bzoj 1016: [JSOI2008]最小生成树计数【dfs+克鲁斯卡尔】

    有一个性质就是组成最小生成树总边权值的若干边权总是相等的 这意味着按边权排序后在权值相同的一段区间内的边能被选入最小生成树的条数是固定的 所以先随便求一个最小生成树,把每段的入选边数记录下来 然后对于 ...

  3. 【BZOJ 1016】 1016: [JSOI2008]最小生成树计数 (DFS|矩阵树定理)

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

  4. bzoj1016: [JSOI2008]最小生成树计数(kruskal+dfs)

    1016: [JSOI2008]最小生成树计数 题目:传送门 题解: 神题神题%%% 据说最小生成树有两个神奇的定理: 1.权值相等的边在不同方案数中边数相等  就是说如果一种方案中权值为1的边有n条 ...

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

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

  6. BZOJ.1016.[JSOI2008]最小生成树计数(Matrix Tree定理 Kruskal)

    题目链接 最小生成树有两个性质: 1.在不同的MST中某种权值的边出现的次数是一定的. 2.在不同的MST中,连接完某种权值的边后,形成的连通块的状态是一样的. \(Solution1\) 由这两个性 ...

  7. bzoj 1016 [JSOI2008]最小生成树计数——matrix tree(相同权值的边为阶段缩点)(码力)

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1016 就是缩点,每次相同权值的边构成的联通块求一下matrix tree.注意gauss里的 ...

  8. BZOJ 1016 [JSOI2008]最小生成树计数 ——Matrix-Tree定理

    考虑从小往大加边,然后把所有联通块的生成树个数计算出来. 然后把他们缩成一个点,继续添加下一组. 最后乘法原理即可. 写起来很恶心 #include <queue> #include &l ...

  9. 1016: [JSOI2008]最小生成树计数

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

随机推荐

  1. ios jsbrige

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  2. Solr学习(2) Solr4.2.0+IK Analyzer 2012

    Solr学习(二) Solr4.2.0+IK Analyzer 2012 开场白: 本章简单讲述如何在solr中配置著名的 IK Analyzer 分词器. 本章建立在 Solr学习(一)  基础上进 ...

  3. iOS中的retainCount

    我们都知道iOS中采用引用计数的技术来管理内存,当一个对象没有任何一个地方引用的时候会自动释放,此时的retainCount为0,而且提供了一个-(NSInteger)retainCount的方法来获 ...

  4. 统计分析SQL Server Profiler 跟踪的SQL

    --跟踪文件读入到表中分析 SELECT * INTO ZGSJY FROM fn_trace_gettable('E:\wxxcdbprofiler.trc', default); --某时间内,最 ...

  5. redis持久化与可用性

    redis对于持久化有快照及aof日志文件两种形式. 快照db文件,长处是二进制,大小比aof日志文件小.但会丢失最后一次成功备份时间到down机时间的数据. aof相比而言文件大小就大了点,但相对快 ...

  6. iOS开发-object-c之 @[], @{}

    今天看别人代码的时候发现这样的用法 navigationController.viewControllers = @[secondViewController]; 这里用到了@[]. 刚开始不是很明白 ...

  7. JavaScript之JS实现动画效果

    在前面的随笔中介绍了如何用DOM技术修改文档的央样式信息,用JavaScript添加样式信息可以节约我们的时间和精力,但总的来说,CSS仍是完成这类任务的最佳工具.但是有一个应用领域是目前的CSS无能 ...

  8. spring mvc 返回json数据的四种方式

    一.返回ModelAndView,其中包含map集 /* * 返回ModelAndView类型的结果 * 检查用户名的合法性,如果用户已经存在,返回false,否则返回true(返回json数据,格式 ...

  9. ubuntu菜单面板丢了怎么找回

    我的ubuntu菜单面板丢了.   我的ubuntu用的是gnome桌面环境,桌面环境分为三个区域: 1.菜单面板 (1)三个主菜单:应用程序,位置,系统. (2)快速启动区:菜单面板中间的部分称为快 ...

  10. STL模板_概念

    模板和STL一.模板的背景知识1.针对不同的类型定义不同函数版本.2.借助参数宏摆脱类型的限制,同时也因为失去的类型检查而引 入风险.3.借助于编译预处理器根据函数宏框架,扩展为针对不同类型的 具体函 ...