题目描述

现在给出了一个简单无向加权图。你不满足于求出这个图的最小生成树,而希望知道这个图中有多少个不同的最小生成树。(如果两颗最小生成树中至少有一条边不同,则这两个最小生成树就是不同的)。由于不同的最小生成树可能很多,所以你只需要输出方案数对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的模就可以了。

输入输出样例

输入样例#1:

4 6
1 2 1
1 3 1
1 4 1
2 3 2
2 4 1
3 4 1

输出样例#1:

8

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

源代码

#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];
struct build {int l,r;int cnt;
} a[N];
int tot;
int n,m;
int father[N];
int sum;int Find(int x) {if(father[x]!=x)return Find(father[x]);return father[x];
}void dfs(int x,int now,int num) {if(now==a[x].r+1) {if(num==a[x].cnt)//选指定的条数sum++;return ;}int fx=Find(edge[now].x);int fy=Find(edge[now].y);if(fx!=fy) {//选father[fx]=fy;dfs(x,now+1,num+1);father[fx]=fx;father[fy]=fy;}dfs(x,now+1,num);//不选
}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++) {if(edge[i].dis!=edge[i-1].dis) {tot++;a[tot].l=i;a[tot-1].r=i-1;}int x=Find(edge[i].x);int y=Find(edge[i].y);if(x!=y) {father[y]=x;a[tot].cnt++;cnt++;}}a[tot].r=m;return cnt;
}int main() {scanf("%d%d",&n,&m);int x,y,z;for(int i=1; i<=m; i++)scanf("%d%d%d",&edge[i].x,&edge[i].y,&edge[i].dis);int num=Kruskal();if(num!=n-1) {printf("0");return 0;}else{for(int i=1; i<=n; i++)father[i]=i;int res=1;for(int i=1; i<=tot; i++) {sum=0;dfs(i,a[i].l,0);res=res*sum%MOD;for(int j=a[i].l; j<=a[i].r; j++) {int x=Find(edge[j].x);int y=Find(edge[j].y);if(x!=y)father[y]=x;}}printf("%d",res);}return 0;
}

最小生成树计数(洛谷-P4208)相关推荐

  1. 信息学奥赛一本通 1316:【例4.6】数的计数(Noip2001) | 1914:【01NOIP普及组】数的计数 | 洛谷 P1028 [NOIP2001 普及组] 数的计算

    [题目链接] ybt 1316:[例4.6]数的计数(Noip2001) ybt 1914:[01NOIP普及组]数的计数 洛谷 P1028 [NOIP2001 普及组] 数的计算 [题目考点] 1. ...

  2. 拓扑排序——最大食物链计数(洛谷 P4017)

    题目选自洛谷P4017 这里具体讲一下为什么要用拓扑排序(思维过程): 1.这是一道图论题: 2.不是求最短路: 3.根据提示"最左端是不会捕食其他生物的生产者"可以想到,我们要入 ...

  3. 洛谷 P4208 [JSOI2008]最小生成树计数 矩阵树定理

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

  4. BZOJ1016 || 洛谷P4208 [JSOI2008]最小生成树计数【矩阵树定理】

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

  5. 【最小生成树】洛谷P2259 Charmer--viv

    双倍经验!(窥屏+水) 题链--Link 另一题题链--Link 题目 Sample input 5 1 2 3 4 5 4 3 2 1 3 4 5 2 1 5 Sample output 7 解 同 ...

  6. #容斥,组合计数#洛谷 3214 卡农

    题目 在集合S=[1∼n]S=[1\sim n]S=[1∼n]中选出mmm个子集,满足三点性质: 所有选出的mmm个子集都不能为空. 所有选出的mmm个子集中,不能存在两个完全一样的集合. 所有选出的 ...

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

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

  8. 洛谷--橙色百道DP总结

    最近刷完了洛谷橙色DP大约一百道,算是发现了一些套路,就部分题目做一些总结. 大概分为三类 第一类,九大背包及其衍生 第二类,经典DP模型,如LCS,LIS等 第三类,实际问题背景的普通,环形,树上D ...

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

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

最新文章

  1. [转]Java加密算法
  2. 挑出IIS日志里某一文件的请求次数
  3. 入住cnblogs第一篇随笔 Hello, world!
  4. python扫描内网banner信息
  5. hypermesh 复合材料_【技术邻】HyperMesh复合材料建模——坐标系调整
  6. Buildroot构建指南——根文件系统(Rootfs)
  7. 【HDU - 5050 】Divided Land (Java大数,大数进制转换,大数gcd)
  8. 【Spark】Spark Streaming的back pressure
  9. mySQL中replace的用法
  10. ubuntu7.10下配置java 6和mysql
  11. 华三模拟器(路由器)实现ipsec穿越NAT实验
  12. iCollections for Mac(桌面图标及文件整理工具)
  13. java word书签_java和javascript获取word的 书签位置
  14. 爬虫入门实战:斗鱼弹幕数据抓取,附送11节入门笔记
  15. 『互联网架构』埋点基础知识
  16. 基于STM32F103的直流电机调速系统
  17. 利用dcmtk工具查询PACS,找到同一患者两次以上的检查的数据
  18. Java面试-001
  19. Oracle通过SPOOL导出数据Excel、CSV、TXT格式
  20. keep-alive上加v-if导致缓存失效

热门文章

  1. [原创]vc中创建线程并传递参数
  2. 第一个Django页面
  3. 密码学二次剩余困难性问题The Quadratic Residuosity Problem
  4. Linux下动态库的创建与更新
  5. 在计算机网络中为了保证正确传输,计算机网络试卷B
  6. java deque.pop_Java ArrayDeque pop()方法
  7. python合并两个excel文件_利用Python将多个excel文件合并为一个文件
  8. 耗费 7.5 亿做的“垃圾”,被 3 个程序员爸爸重写并开源了
  9. JavaEE基础(05):过滤器、监听器、拦截器,应用详解
  10. MediaCodec的使用和若干问题处理