最小生成树的计数问题
时间:2019-12-11
本文章向大家介绍最小生成树的计数问题,主要包括最小生成树的计数问题使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
https://www.luogu.com.cn/problemnew/solution/P4208
看这里的题解就够了其实
#include<iostream> #include<cstdio> #include<cstring> #include<vector> #include<algorithm> #define maxn 1010 using namespace std; const int mod = 31011; int n, m; struct Node { int be, en, len, cnt; }que[maxn]; vector<Node>ins; bool bml(Node a, Node b) { return a.len < b.len; } int par[111]; int find(int x) { if (par[x] == -1) return x; return find(par[x]); } int ans = 0; int dfs(int x, int i, int k) { if (i == ins[x].en + 1) { if (k == ins[x].cnt) ans++; return 0; } int a = find(que[i].be); int b = find(que[i].en); if (a != b) { par[a] = b; dfs(x, i + 1, k + 1);//选 par[a] = -1; par[b] = -1; } dfs(x, i + 1, k);//不选 } int main() { memset(par, -1, sizeof(par)); scanf("%d%d", &n, &m); for (int i = 1; i <= m; i++) { scanf("%d%d%d", &que[i].be, &que[i].en, &que[i].len); } sort(que + 1, que + m + 1, bml); que[m + 1].len = -1; int cnt = 0; int nn = 0; for (int i = 1; i <= m; i++) { int a = find(que[i].be); int b = find(que[i].en); if (a != b) { par[a] = b; cnt++; nn++; } if (que[i].len != que[i+1].len) { Node an; an.en = i; an.len = que[i].len; an.cnt = cnt; cnt = 0; if (ins.size() == 0) an.be = 1; else an.be = ins[ins.size() - 1].en + 1; ins.push_back(an); } } if (nn != n - 1) { printf("0\n"); return 0; } memset(par, -1, sizeof(par)); int cns = 1; for (int i = 0; i < ins.size(); i++) { dfs(i, ins[i].be, 0); cns = (cns*ans) % mod; ans = 0; for (int j = ins[i].be; j <= ins[i].en; j++) { int a = find(que[j].be); int b = find(que[j].en); if (a != b) { par[a] = b; } } } printf("%d\n", cns); return 0; }
原文地址:https://www.cnblogs.com/lesning/p/12022107.html
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- R语言入门之变量重编码与重命名
- Kubeflow Pipeline - 构建一个机器学习 Workflow
- Git 如何压缩 commit
- How go build works
- 网状Meta分析之R语言‘gemtc’包实战(3)
- 关于 K8S API Resources: Group 和 Version 该怎么写
- ZooKeeper 的应用场景
- 在 K8S 部署一个 Spark History Server - 篇3
- Go 学习笔记-1
- Tensorflow-gpu 运行在 cpu 母机的问题
- R语言入门之散点图
- Python函数(一)
- Spark on Kubernetes 动态资源分配
- R语言入门之偏度(skewness)与峰度(kurtosis)
- Spark Operator 是如何提交 Spark 作业