题意

最小生成树计数

思路

基尔霍夫kirchhoff矩阵N-1阶主子式的行列式即为最小生成树的数目,需要注意这里必须满足每一条边都相等。
基尔霍夫Kirchhoff矩阵 K =度数矩阵 D - 邻接矩阵 A
注意:邻接矩阵存是否连接
N-1阶主子式:对于N矩阵,任取r,去掉r行r列剩余的矩阵
所以最终归结如何快速求行列式:
由高斯消元,将矩阵化为上三角,最终答案就是对角线之积,O(n^3).
如果涉及取模,模不一定要是质数,则辗转相除高斯消元 (n^3logn)
相同权的边的最小生成树数目可以做了,问题是无向图的边权不一定相同,所以我们要把相同边权的放在一个集合,对每个集合进行求最先生成树计数,利用乘法原理,得到答案。
但是相同边的放在一起求最小生成树,有一个前提,必须保证图时连通的,这就需要把其他没有用到的最小生成树的边缩点,这样就能保证连通性。

#include<bits/stdc++.h>
using namespace std;
#define N 105
#define M 1005
#define MOD 31011
//原图,边权离散化并按相等边权存储
struct edge
{int x, y, v;
} tp[M], mst[M];
vector<edge> ff[M];
bool cmp(edge a, edge b)
{return a.v<b.v;
}bool is[M];//标记最小生成树的边权,用了离散化,标记某一种边权//并查集
int bcj[N], bel[N];
void init(int a)
{for (int i = 1; i <= a; i++)bcj[i] = i;
}int find(int x)
{return bcj[x] == x ? x : bcj[x] = find(bcj[x]);
}bool uni(int a, int b)
{int p = find(a), q = find(b);if (p == q) return true;bcj[p] = q;return false;
}//三个矩阵 度数、邻接、基尔霍夫
int n, deg[N][N], g[N][N], mat[N][N];int treecnt()//生成树计数,辗转相除高斯消元
{int i, j, k, ans = 1;for (i = 1; i<n; i++){for (j = i + 1; j<n; j++){while (mat[j][i]){int div = mat[i][i] / mat[j][i];for (k = i; k<n; k++) mat[i][k] = (mat[i][k] - 1ll * mat[j][k] * div%MOD + MOD) % MOD;swap(mat[i], mat[j]);ans *= -1;}if (mat[i][i] == 0) return 0;}ans = 1ll * ans*mat[i][i] % MOD;}return (ans + MOD) % MOD;
}int main()
{int a, b, i, j, k, tl = 0, tmp = 0, cnt = 0;scanf("%d%d", &a, &b);init(a);for (i = 0; i<b; i++) scanf("%d%d%d", &tp[i].x, &tp[i].y, &tp[i].v);sort(tp, tp + b, cmp);//kruskalfor (i = 0; i<b; i++){if (tp[i].v != tmp) tl++, tmp = tp[i].v;//记录边权种数ff[tl].push_back(tp[i]);//离散化,将相同边权的放在一个集合里if (uni(tp[i].x, tp[i].y)) continue;is[tl] = 1, mst[cnt] = tp[i], mst[cnt++].v = tl;}if (cnt != a - 1){printf("0");return 0;}//统计答案int ans = 1;for (i = 1; i <= tl; i++){//如果最小生成树中没有用到此边权if (!is[i]) continue;init(a);int siz = ff[i].size();n = 0;//将生成树上的边全部连上并缩点for (j = 0; j<cnt; j++){if (mst[j].v == i) continue;uni(mst[j].x, mst[j].y);}for (j = 1; j <= a; j++)if (bcj[j] == j) bel[j] = ++n;for (j = 1; j <= a; j++) bel[j] = bel[find(j)];//将原图中此边权的边全部连上for (j = 0; j<siz; j++){int bx = bel[ff[i][j].x], by = bel[ff[i][j].y];deg[bx][bx]++, deg[by][by]++;g[bx][by]++, g[by][bx]++;}for (j = 1; j <= n; j++)for (k = 1; k <= n; k++)mat[j][k] = deg[j][k] - g[j][k];ans = ans * treecnt() % MOD;//删除连上的边for (j = 0; j<siz; j++){int bx = bel[ff[i][j].x], by = bel[ff[i][j].y];deg[bx][bx]--, deg[by][by]--;g[bx][by]--, g[by][bx]--;}}printf("%d", ans);return 0;
}

参考文献:https://www.cnblogs.com/zj75211/p/8039443.html

洛谷4208 最小生成树计数相关推荐

  1. 洛谷 最大食物链计数 python题解

    题目:P4017 最大食物链计数 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题目描述 给你一个食物网,你要求出这个食物网中最大食物链的数量. (这里的"最大食物链&q ...

  2. Educational Codeforces Round 81 (Rated for Div. 2) F.Good Contest \ 洛谷 划艇 组合 计数dp

    cf传送门 P3643 [APIO2016]划艇 文章目录 题意: 思路: 题意: aia_iai​在[li,ri][l_i,r_i][li​,ri​]等概率随机选一个数,求aaa数组不增的概率. 思 ...

  3. 洛谷 P1176 路径计数2

    P1176 路径计数2 题目描述 一个N×N的网格,你一开始在(1, 1),即左上角.每次只能移动到下方相邻的格子或者右方相邻的格子,问到达(N, N),即右下角有多少种方法. 但是这个问题太简单了, ...

  4. 洛谷——P1176 路径计数2

    P1176 路径计数2 题目描述 一个N \times NN×N的网格,你一开始在(1,1)(1,1),即左上角.每次只能移动到下方相邻的格子或者右方相邻的格子,问到达(N,N)(N,N),即右下角有 ...

  5. 洛谷 1550 最小生成树

    首先因为这题是连通性问题求最值,考虑最小生成树是否可做,这题一个比较不同的地方是它每一个点有权值,我们考虑能否将点的权值转化成边权,因为如果能够转化成功,我们就可以很轻松的用最小生成树求解,我们可以建 ...

  6. 洛谷P2518 [HAOI2010]计数

    题目描述 你有一组非零数字(不一定唯一),你可以在其中插入任意个0,这样就可以产生无限个数.比如说给定{1,2},那么可以生成数字12,21,102,120,201,210,1002,1020,等等. ...

  7. 洛谷or牛客数据结构+算法

    栈思想:先进后出 tips:栈里能放下标就放下标 (牛客)小c的计事本(直接用stack可以简化代码,且不会被自己绕晕,当时没意识到) (牛客)吐泡泡(没意识到用栈),(牛客)好串 1.后缀表达式(栈 ...

  8. 洛谷 深基 第4部分 基础数学与数论(19-21课)

    洛谷 深基 第4部分 基础数学与数论  第19章 位运算与进制转换 P1143 进制转换 https://www.luogu.com.cn/problem/P1143 洛谷P1143 进制转换的Pyt ...

  9. 【暑期每日一题】洛谷(一)

    [暑期每日一题]洛谷 P1048 [NOIP2005 普及组] 采药 [暑期每日一题]洛谷 P1048 [NOIP2005 普及组] 采药_辰辰是个天资聪颖的孩子,他的梦想是成为世界上最伟大的医师.为 ...

最新文章

  1. linux cache控制 内核,linux内核之bcache简介 [转]
  2. python有哪些作用-python的函数有什么作用
  3. Vim的一些使用技巧
  4. [转].NET 数据库连接池
  5. 如何在ASP.NET Core应用中实现与第三方IoC/DI框架的整合?
  6. 【渝粤题库】陕西师范大学210001儿童心理学 作业(高起专、高起本)
  7. sqlserver迁移数据到mysql_SQLServer数据库之将ABP的数据库从SQLSERVER迁移到MySql
  8. 《MySQL tips:隐式类型转换与隐式字符编码转换对查询效率的影响》
  9. 创建代码生成器可以很简单:如何通过T4模板生成代码?[上篇]
  10. python常见面试题(三)
  11. java集合框架源代码_面试必备——Java集合框架
  12. 华为系列设备ACL配置和应用常见问题
  13. Fiddler配置自动响应
  14. DSP 性能 GMAC 和 GFLOP含义
  15. 微信小程序免费http转https
  16. SQL Pretty Printer
  17. R语言作图——Pie chart(饼图)
  18. 航空行业数字化转型解决方案(附PDF下载)
  19. Andriod Studio
  20. 高温加重精神症状!好心情提醒患者做好10点防护

热门文章

  1. java 栅栏_Java 并发工具类(栅栏 CyclicBarrier )
  2. 凡吸纳鲁宾逊微积分者,必须遵守“知识共享”授权许可
  3. Win10 清理备用内存
  4. jquery水平导航栏动态菜单
  5. 服务器 远程桌面限制IP 与 (虚拟专用网络) 结合的安全策略
  6. 为什么有些编程程序员需要两个显示器?
  7. Android之连接指定SSID的无线网络
  8. PNG透明图片叠加(Opencv实现,包括旋转缩放以及边界处理)
  9. Linux/Unix设计思想
  10. 请更换备份电池 pos机_POS机报错58终端无效的快速处理方法!