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];
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;
}

最小生成树计数(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. 用于制图、写电子邮件、创建条形码控件Aspose.Total
  2. 【语义分割】ICCV21_Self-Regulation for Semantic Segmentation
  3. Sharepoint 2013设置customErrors
  4. 一个封装了的ADO类,功能非常强大,并做了一个DEMO演示如何操作ACCESS数据库
  5. AFNetworking 3.0源码阅读 - AFURLResponseSerialization
  6. 能“看穿”换脸视频背后的AI模型,Facebook的反Deepfake方法有点东西
  7. Android 性能测试——Memory Monitor 工具
  8. svn使用过程中遇到的问题
  9. 西电软件工程概论复习笔记(含重点标注)
  10. php安装libpng,求助:libpng编译问题
  11. web网页保存为PDF文件
  12. 苹果恢复出厂设置好吗_苹果承认Apple Music导致iPhone耗电严重 唯一解决方法是恢复出厂设置...
  13. cad如何打开stp文件_stp是什么文件?怎么打开stp文件?
  14. 【工业互联网】漫谈“工业互联网”与“智能制造”
  15. PS~了解PS的第一步,基本操作
  16. 【Android】制作一个简易的画板
  17. 玩转外贸LinkedIn必备的三大特质,以及突破六度人脉技巧
  18. C++ 域名转IP地址
  19. R语言回归分析-回归诊断
  20. 潍坊学院计算机打破世界纪录,牛!2017 ASC世界大学生超级计算机总决赛 潍坊学院每秒31.7万亿次峰值计算刷新世界纪录...

热门文章

  1. Xdebug 使用说明
  2. 从用户不足2000万到27亿,这项技术真要上天了?
  3. 这些“震惊世界的新发现”,原来都是科学界的大骗局
  4. java xml数据解析_java xml解析,数据读取
  5. 2022年第一个线上问题,被领导骂惨了!
  6. FinTech专题:支付平台建设资金底线防火墙的杀手级设计方案
  7. Windows平台下SVN安装配置及使用
  8. UEditor在线编辑器配置及注意事项
  9. JSF请求处理过程(一) FacesServlet初始化
  10. 深度解析大型分布式电商网站演变过程以及构架部署解决方案