题目大意:$n$个点和$m$条边(最多有$10$条边边权相同),求最小生成树个数

题解:对于所有最小生成树,每种边权的边数是一样的。于是就可以求出每种边权在最小生成树中的个数,枚举这种边的边集,求出对于这个边集可以的解(即没有一条边在同一联通块中),再把每种边的方案数乘起来即可。

卡点:

C++ Code:

#include <cstdio>
#include <algorithm>
using namespace std;
const long long mod = 31011;
struct Edge {
int from, to, w;
bool operator < (const Edge &a) const {return w < a.w;}
} e[1010];
int n, m;
struct Set {
int f[111];
int find(int x) {return ((x == f[x]) ? x : (f[x] = find(f[x])));}
bool operator = (const Set &a) {
for (int i = 1; i <= n; i++) f[i] = a.f[i];
}
} s1, s2;
long long ans = 1;
int main() {
scanf("%d%d", &n, &m);
for (int i = 1; i <= m; i++) scanf("%d%d%d", &e[i].from, &e[i].to, &e[i].w);
sort(e + 1, e + m + 1);
for (int i = 1; i <= n; i++) s1.f[i] = s2.f[i] = i;
for (int i = 1; i <= m; i++) {
int same = i, cnt = 0, res = 0;
while (same < m && e[same].w == e[same + 1].w) same++;
s1 = s2;
for (int j = i; j <= same; j++) {
int u = s1.find(e[j].from), v = s1.find(e[j].to);
if (u != v) {
s1.f[u] = v;
cnt++;
}
}
for (int j = 0; j < 1 << same - i + 1; j++) {
bool flag = false;
if (__builtin_popcount(j) == cnt) {
flag = true;
s1 = s2;
for (int k = i; k <= same; k++) {
if (j & 1 << k - i) {
int u = s1.find(e[k].from), v = s1.find(e[k].to);
if (u == v) {
flag = false;
break;
} else s1.f[u] = v;
}
}
}
res += flag;
}
for (int j = i; j <= same; j++) {
int u = s2.find(e[j].from), v = s2.find(e[j].to);
if (u != v) s2.f[u] = v;
}
ans = (ans * res) % mod;
}
int tmp = s2.find(1);
for (int i = 2; i <= n; i++) if (s2.find(i) != tmp) {
puts("0");
return 0;
}
printf("%d\n", ans);
return 0;
}

  

[洛谷P4208][JSOI2008]最小生成树计数的更多相关文章

  1. 洛谷P4208 [JSOI2008]最小生成树计数——题解

    题目传送 前置知识:对于同一个图的所有最小生成树,权值相等的边的数量相同. 可以简单证明一下: 我们可以从kruskal的过程考虑.这个算法把所有边按权值大小从小到大排序,然后按顺序看每条边,只要加上 ...

  2. Solution -「JSOI2008」「洛谷 P4208」最小生成树计数

    \(\mathcal{Description}\)   link.   给定带权简单无向图,求其最小生成树个数.   顶点数 \(n\le10^2\),边数 \(m\le10^3\),相同边权的边数不 ...

  3. 洛谷4208 JSOI2008最小生成树计数(矩阵树定理+高斯消元)

    qwq 这个题目真的是很好的一个题啊 qwq 其实一开始想这个题,肯定是无从下手. 首先,我们会发现,对于无向图的一个最小生成树来说,只有当存在一些边与内部的某些边权值相同的时候且能等效替代的时候,才 ...

  4. P4208 [JSOI2008]最小生成树计数

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

  5. Luogu P4208 [JSOI2008]最小生成树计数

    题意 给定一个 \(n\) 个点 \(m\) 条边的图,求最小生成树的个数. \(\texttt{Data Range:}1\leq n\leq 100,1\leq m\leq 10^4\) 题解 一 ...

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

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

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

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

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

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

  9. 洛谷 P1596 [USACO10OCT]湖计数Lake Counting

    题目链接 https://www.luogu.org/problemnew/show/P1596 题目描述 Due to recent rains, water has pooled in vario ...

随机推荐

  1. Tornado学习

    为什么用Tornado? 异步编程原理 服务器同时要对许多客户端提供服务,他的性能至关重要.而服务器端的处理流程,只要遇到了I/O操作,往往需要长时间的等待.   屏幕快照 2018-10-31 上午 ...

  2. json_decode结果为null的几种原因

    值只能是UTF-8编码,元素最后不能有逗号,元素不能使用单引号,元素值中间不能有空格和n.

  3. 使用MapReduce读取HBase数据存储到MySQL

    Mapper读取HBase数据 package MapReduce; import org.apache.hadoop.hbase.Cell; import org.apache.hadoop.hba ...

  4. 从多Sheet的Excel文件中抽取数据

    在数据驱动管理中增加Excle的JDBCODBC驱动 类名:sun.jdbc.odbc.JdbcOdbcDriver URL模板:jdbc:odbc:driver={Microsoft Excel D ...

  5. 11 非阻塞套接字与IO多路复用(进阶)

    1.非阻塞套接字 第一部分 基本IO模型 1.普通套接字实现的服务端的缺陷 一次只能服务一个客户端! 2.普通套接字实现的服务端的瓶颈!!! accept阻塞! 在没有新的套接字来之前,不能处理已经建 ...

  6. python生成器详解

    1. 生成器 利用迭代器(迭代器详解python迭代器详解),我们可以在每次迭代获取数据(通过next()方法)时按照特定的规律进行生成.但是我们在实现一个迭代器时,关于当前迭代到的状态需要我们自己记 ...

  7. python_day4_shopping

    购物车例子,实现显示商品信息,输入商品编号并且可以减去自己的存入余额,当商品价格大于自己的余额的时候,直接退出:当不再选择商品的时候,退出显示余额和已经添加的商品. #购物车程序 product_li ...

  8. 网站安全检测 漏洞检测 对thinkphp通杀漏洞利用与修复建议

    thinkphp在国内来说,很多站长以及平台都在使用这套开源的系统来建站,为什么会这么深受大家的喜欢,第一开源,便捷,高效,生成静态化html,第二框架性的易于开发php架构,很多第三方的插件以及第三 ...

  9. (数据科学学习手札01)Python与R基本数据结构之异同

    Python 1.列表(list) list1 = [i for i in range(10)] list1[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 特点:可遍历,可索引,可切片 ...

  10. 暗影精灵3安装无线网卡驱动(ubuntu16.04)

    干货,无线网卡安装步骤: 1. 由于暗影精灵3的无线网卡较新,版本为Realtek Device b822,(查看命令为lspci | grep -i net,Ethernet controller代 ...