最小生成树计数 bzoj 1016
最小生成树计数
【问题描述】
现在给出了一个简单无向加权图。你不满足于求出这个图的最小生成树,而希望知道这个图中有多少个不同的最小生成树。(如果两颗最小生成树中至少有一条边不同,则这两个最小生成树就是不同的)。由于不同的最小生成树可能很多,所以你只需要输出方案数对31011的模就可以了。
【输入格式】
第一行包含两个数,n和m,其中1<=n<=100; 1<=m<=1000; 表示该无向图的节点数和边数。每个节点用1~n的整数编号。接下来的m行,每行包含两个整数:a, b, c,表示节点a, b之间的边的权值为c,其中1<=c<=1,000,000,000。数据保证不会出现自回边和重边。注意:具有相同权值的边不会超过10条。
【输出格式】
输出不同的最小生成树有多少个。你只需要输出数量对31011的模就可以了。
【样例输入】
4 6
1 2 1
1 3 1
1 4 1
2 3 2
2 4 1
3 4 1
【样例输出】
8
题解:
1.用克鲁斯卡尔求一遍最小生成树,统计出某一权值在最小生成树中的个数(即所有权值相同的边的个数)
2.考虑对于每一种权值的方案(Dfs)
要求:
(1)选出的边数等于最小生成树中该权值拥有的边数
原理:最小生成树中每种权值的边数不变
(2)不含环,判断是否有环可以用不压缩路径的并查集处理
原理:树中不含环
3.将所有权值的方案相乘
原理:在最小生成树中对于每一种权值的合法方案构建出的图的连通情况相同
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<cmath>
using namespace std;
inline int Get()
{
int x = , s = ;
char c = getchar();
while('' > c || c > '')
{
if(c == '-') s = -;
c = getchar();
}
while('' <= c && c <= '')
{
x = (x << ) + (x << ) + c - '';
c = getchar();
}
return x * s;
}
struct shape
{
int x, y, z;
};
shape a[];
int n, m, k;
int tot;
int cnt;
int sum;
int l[];
int r[];
int s[];
int fat[];
int c[];
int u[];
inline bool rule(shape a, shape b)
{
return a.z < b.z;
}
int Find(int x)
{
while(fat[x] != x) x = fat[x];
return x;
}
void Dfs(int fig, int va, int le)
{
if(fig == s[va])
{
sum = (sum + ) % ;
if(sum == )
for(int i = ; i <= c[]; ++i)
u[i] = c[i];
// for(int i = 1; i <= c[0]; ++i) printf("%d ", c[i]);
// cout<<endl;
return;
}
for(int i = le; i <= r[va]; ++i)
{
int x = Find(a[i].x);
int y = Find(a[i].y);
int cx = fat[x];
if(x == y) continue;
fat[x] = y;
c[++c[]] = i;
Dfs(fig + , va, i + );
fat[x] = cx;
--c[];
}
}
int main()
{
n = Get(), m = Get();
for(int i = ; i <= m; ++i)
{
a[i].x = Get();
a[i].y = Get();
a[i].z = Get();
}
sort(a + , a + + m, rule);
for(int i = ; i <= n; ++i) fat[i] = i;
for(int i = ; i <= m; ++i)
{
if(a[i].z != a[i - ].z)
{
r[tot] = i - ;
++tot;
l[tot] = i;
}
if(k != n - )
{
int x = Find(a[i].x), y = Find(a[i].y);
if(x != y)
{
fat[x] = y;
++s[tot];
++k;
}
}
}
if(k != n - )
{
printf("");
return ;
}
r[tot] = m;
for(int i = ; i <= n; ++i) fat[i] = i;
int ans = ;
for(int i = ; i <= tot; ++i)
if(s[i])
{
sum = ;
Dfs(, i, l[i]);
for(int l = ; l <= u[]; ++l)
{
int x = Find(a[u[l]].x);
int y = Find(a[u[l]].y);
fat[x] = y;
}
ans = (ans * sum) % ;
}
printf("%d", ans);
}
最小生成树计数 bzoj 1016的更多相关文章
- 最小生成树的边的概念问题!!! 最小生成树的计数 bzoj 1016
1016: [JSOI2008]最小生成树计数 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 5292 Solved: 2163[Submit][St ...
- 1016: [JSOI2008]最小生成树计数 - BZOJ
Description 现在给出了一个简单无向加权图.你不满足于求出这个图的最小生成树,而希望知道这个图中有多少个不同的最小生成树.(如果两颗最小生成树中至少有一条边不同,则这两个最小生成树就是不同的 ...
- 【BZOJ】【1016】【JSOI2008】最小生成树计数
Kruskal/并查集+枚举 唉我还是too naive,orz Hzwer 一开始我是想:最小生成树删掉一条边,再加上一条边仍是最小生成树,那么这两条边权值必须相等,但我也可以去掉两条权值为1和3的 ...
- [BZOJ 1016] [JSOI2008] 最小生成树计数 【DFS】
题目链接:BZOJ - 1016 题目分析 最小生成树的两个性质: 同一个图的最小生成树,满足: 1)同一种权值的边的个数相等 2)用Kruscal按照从小到大,处理完某一种权值的所有边后,图的连通性 ...
- BZOJ 1016: [JSOI2008]最小生成树计数( kruskal + dfs )
不同最小生成树中权值相同的边数量是一定的, 而且他们对连通性的贡献是一样的.对权值相同的边放在一起(至多10), 暴搜他们有多少种方案, 然后乘法原理. ----------------------- ...
- 【BZOJ 1016】 1016: [JSOI2008]最小生成树计数 (DFS|矩阵树定理)
1016: [JSOI2008]最小生成树计数 Description 现在给出了一个简单无向加权图.你不满足于求出这个图的最小生成树,而希望知道这个图中有多少个不同的最小生成树.(如果两颗最小生成树 ...
- [BZOJ]1016 JSOI2008 最小生成树计数
最小生成树计数 题目描述 现在给出了一个简单无向加权图.你不满足于求出这个图的最小生成树,而希望知道这个图中有多少个不同的最小生成树.(如果两颗最小生成树中至少有一条边不同,则这两个最小生成树就是不同 ...
- 【BZOJ】1016: [JSOI2008]最小生成树计数 深搜+并查集
最小生成树计数 Description 现在给出了一个简单无向加权图.你不满足于求出这个图的最小生成树,而希望知道这个图中有多少个不同的最小生成树.(如果两颗最小生成树中至少有一条边不同,则这两个最小 ...
- 1016: [JSOI2008]最小生成树计数
1016: [JSOI2008]最小生成树计数 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 6200 Solved: 2518[Submit][St ...
随机推荐
- Spring中Bean的作用域、生命周期
Bean的作用域.生命周期 Bean的作用域 Spring 3中为Bean定义了5中作用域,分别为singleton(单例).protot ...
- C++ 拷贝构造函数和赋值运算符
本文主要介绍了拷贝构造函数和赋值运算符的区别,以及在什么时候调用拷贝构造函数.什么情况下调用赋值运算符.最后,简单的分析了下深拷贝和浅拷贝的问题. 拷贝构造函数和赋值运算符 在默认情况下(用户没有定义 ...
- AutoMapper的介绍与使用(一)
软件环境 vs2015 asp.net mvc 5 .NET Framework 4.5.2 AutoMapper 5.2.0.0 AutoMapper安装 新建asp.net mvc 项目 Auto ...
- myeclipse 内存不够用报错PermGen space 和 An internal error has occurred.
最近项目中又增加了新的模块,项目的代码又多了不少.运行的时候总是报如下错误 Exception in thread "http-apr-80-exec-6" java.lang.O ...
- ES6(块级作用域)
我们都知道在javascript里是没有块级作用域的,而ES6添加了块级作用域,块级作用域能带来什么好处呢?为什么会添加这个功能呢?那就得了解ES5没有块级作用域时出现了哪些问题. ES5在没有块级作 ...
- docker4dotnet #3 在macOS上使用Visual Studio Code和Docker开发asp.net core和mysql应用
.net猿遇到了小鲸鱼,觉得越来越兴奋.本来.net猿只是在透过家里那田子窗看外面的世界,但是看着海峡对岸的苹果园越来越茂盛,实在不想再去做一只宅猿了.于是,.net猿决定搭上小鲸鱼的渡轮到苹果园去看 ...
- [转载]Java 8 日期&时间 API
Java 8 日期和时间 声明 本文转自http://www.journaldev.com/2800/java-8-date-localdate-localdatetime-instant,以mark ...
- 增强版字典DictionaryEx
代码 public class DictionaryEx<TKey, TValue> : IDictionary<TKey, TValue> { /// <summary ...
- Microsoft Visual Studio 2013 — Project搭载IIS配置的那些事
前段时间在改Bug打开一个project时,发生了一件奇怪的事,好好的一直不能加载solution底下的这个project,错误如下图所示:大致的意思就是这个project的web server被配置 ...
- mako模板调试与使用技巧
django默认的模板太不灵活,想把一个数字0.15显示成15%都得费不少劲,太不爽!!! 网上查阅了几个模板系统,有Jinja2等等,最后发现mako能够直接支持python的语句,最为灵活,果断选 ...