Problem 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,0
00。数据保证不会出现自回边和重边。注意:具有相同权值的边不会超过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

思路:最小生成树计数模版题

Source Program

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<string>
#include<cstring>
#include<cmath>
#include<ctime>
#include<algorithm>
#include<utility>
#include<stack>
#include<queue>
#include<vector>
#include<set>
#include<map>
#include<bitset>
#define EPS 1e-9
#define PI acos(-1.0)
#define INF 0x3f3f3f3f
#define LL long long
#define Pair pair<int,int>
const int MOD = 31011;
const int N = 1000+5;
const int dx[] = {0,0,-1,1,-1,-1,1,1};
const int dy[] = {-1,1,0,0,-1,1,-1,1};
using namespace std;struct Edge {int x,y;int dis;bool operator < (const Edge &rhs) const {return dis<rhs.dis;}
} edge[N],tr[N];
int n,m;
int father[N];
int G[N][N];
int tot,bel[N],val[N];
int Find(int x) {if(father[x]!=x)return father[x]=Find(father[x]);return x;
}
int Gauss(int n) {int res=1;for(int i=1; i<=n; i++) {for(int k=i+1; k<=n; k++) {while(G[k][i]) {int d=G[i][i]/G[k][i];for(int j=i; j<=n; j++)G[i][j]=(G[i][j]-1LL*d*G[k][j]%MOD+MOD)%MOD;swap(G[i],G[k]);res=-res;}}res=1LL*res*G[i][i]%MOD,res=(res+MOD)%MOD;}return res;
}
int Kruskal() {sort(edge+1,edge+m+1);for(int i=1; i<=n; i++)father[i]=i;int cnt=0;for(int i=1; i<=m; i++) {int fu=Find(edge[i].x);int fv=Find(edge[i].y);if(fu==fv)continue;father[fu]=fv,tr[++cnt]=edge[i];if(edge[i].dis!=val[tot])val[++tot]=edge[i].dis;}return cnt;
}
void addTreeEdge(int v) {for(int i=1; i<n&&tr[i].dis!=v; i++){int x=tr[i].x;int y=tr[i].y;father[Find(x)]=Find(y);}for(int i=n-1; i&&tr[i].dis!=v; i--){int x=tr[i].x;int y=tr[i].y;father[Find(x)]=Find(y);}
}
void rebuild(int v) {memset(G,0,sizeof(G));for(int i=1; i<=m; i++){if(edge[i].dis==v){int x=bel[edge[i].x];int y=bel[edge[i].y];G[x][y]--;G[y][x]--;G[x][x]++;G[y][y]++;}}
}
int main() {scanf("%d%d",&n,&m);for(int i=1; i<=m; i++)scanf("%d%d%d",&edge[i].x,&edge[i].y,&edge[i].dis);int cnt=Kruskal();if(cnt!=n-1) {printf("0\n");}else{int res=1;for(int i=1; i<=tot; i++) {for(int i=1; i<=n; i++)father[i]=i;addTreeEdge(val[i]);int blo=0;for(int i=1; i<=n; i++)if(Find(i)==i)bel[i]=++blo;for(int i=1; i<=n; i++)bel[i]=bel[Find(i)];rebuild(val[i]);res=1LL*res*Gauss(blo-1)%MOD;}printf("%d\n",res);}return 0;
}

最小生成树计数(HYSBZ-1016)(加强版实现)相关推荐

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

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

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

    1016: [JSOI2008]最小生成树计数 Time Limit: 1 Sec  Memory Limit: 162 MB Submit: 5893  Solved: 2395 [Submit][ ...

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

    1016: [JSOI2008]最小生成树计数 Time Limit: 1 Sec  Memory Limit: 162 MB Submit: 6032  Solved: 2452 [Submit][ ...

  4. BZOJ 1016--[JSOI2008]最小生成树计数(kruskal搜索)

    1016: [JSOI2008]最小生成树计数 Time Limit: 1 Sec  Memory Limit: 162 MB Submit: 7429  Solved: 3098 [Submit][ ...

  5. 最小生成树计数(洛谷-P4208)

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

  6. 最小生成树计数(HYSBZ-1016)(简化版实现)

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

  7. 洛谷4208 最小生成树计数

    题意 最小生成树计数 思路 基尔霍夫kirchhoff矩阵N-1阶主子式的行列式即为最小生成树的数目,需要注意这里必须满足每一条边都相等. 基尔霍夫Kirchhoff矩阵 K =度数矩阵 D - 邻接 ...

  8. HDU 4408 最小生成树计数详细解释

    一些blog看我的好迷,假解释看哭我了,这是我自己的理解,一道题看1天.菜哭 HDU 4408 无向图的最小生成树计数原理 就是在kruskal处理边的时候不断地找到联通块(由多个同长度的边组成的联通 ...

  9. HDU 4408 - Minimum Spanning Tree(最小生成树计数)

    有边权的最小生成树计数 模板 #pragma comment(linker, "/STACK:1024000000,1024000000") #include <iostre ...

最新文章

  1. 如何设置多个图层层叠关系_凉山车载式叠螺污泥脱水机_山东领旗环保科技
  2. 一个炫酷的仿雷达扫描和扩散效果——自定义View就是这么简单
  3. HDRP中ShaderGraph自发光的一个小坑
  4. FreeMarker(一)初识
  5. C++中的封装继承多态
  6. 分布式系统互斥算法---令牌环算法
  7. 并查集(UnionFind)算法
  8. 六、银行会计核算(全是重点)
  9. android中接口的作用是什么意思,Type-C接口有什么好处?和安卓micro USB接口有什么区别...
  10. 《Question Answering on Freebase via Relation Extraction and Textual Evidence》
  11. MySQL8.0学习笔记(8)—— stored procedures,function
  12. vite + ts + eslint全局变量配置
  13. css3 制作音乐播放器音乐播放跳动音符
  14. Svn 命令行工具 操作 SVN 服务器
  15. latex sty文件缺失问题
  16. 瑞·达利欧的《原则》读后感
  17. 学习amber教程A17:伞形采样,绘制丙氨酸三肽的势能面
  18. idea项目相关错误与常用操作教程
  19. 时钟频率,时钟周期他们的关系是什么?
  20. 购物搜索引擎/比较购物网站

热门文章

  1. extjs 日期不显示
  2. 用if语句表达区间分支
  3. 面试了8家公司,他们问了我这些机器学习题目……
  4. win2008 查询 tcp连接失败_TCP详解(转)
  5. Log4j未平,Logback 又起,再爆漏洞。
  6. 代码太烂,可能是他离职的原因吧!
  7. 那些辞职考公的程序员,最后都怎么样了?
  8. 线程池,远没你想象的那么简单
  9. 系统“烂”怎么办?请看资深专家拆分改造实践
  10. 【计算机视觉】【车辆识别】--Matlab实现