【题解】

对于不同的最小生成树,每种权值的边使用的数量是一定的,每种权值的边的作用是确定的

我们可以先做一遍Kruskal,求出每种权值的边的使用数量num

再对于每种权值的边,2^num搜索出合法使用方案,把每种权值的边的方案用乘法原理乘起来就是答案了

 1 #include<cstdio>
 2 #include<algorithm>
 3 using namespace std;
 4 const int maxn=2000,Mod=31011;
 5 int n,m,tot,sum,ans=1,cnt,st[maxn],fa[maxn],num[maxn];
 6 struct edge{int x,y,dis,pos;}e[maxn];
 7 void read(int &k){
 8     k=0; int f=1; char c=getchar();
 9     while(c<'0'||c>'9')c=='-'&&(f=-1),c=getchar();
10     while('0'<=c&&c<='9')k=k*10+c-'0',c=getchar();
11     k*=f;
12 }
13 int find(int x){return fa[x]==x?x:find(fa[x]);}
14 void dfs(int kind,int now,int chosen){
15     if (now==st[kind+1]){
16         if (chosen==num[kind]) sum++;
17         return;
18     }
19     int p=find(e[now].x),q=find(e[now].y);
20     if (p!=q) fa[p]=q,dfs(kind,now+1,chosen+1),fa[p]=p,fa[q]=q;
21     dfs(kind,now+1,chosen);
22 }
23 bool cmp(edge a,edge b){return a.dis<b.dis;}
24 int main(){
25     read(n); read(m);
26     for (int i=1;i<=m;i++)read(e[i].x),read(e[i].y),read(e[i].dis);
27     sort(e+1,e+m+1,cmp);
28     for (int i=1;i<=m;i++) {
29         if (e[i].dis!=e[i-1].dis) st[++cnt]=i;
30         e[i].pos=cnt;
31     }
32     st[cnt+1]=m+1;
33     for (int i=1;i<=n;i++) fa[i]=i;
34     for (int i=1,x,y;i<=m;i++)
35         if ((x=find(e[i].x))!=(y=find(e[i].y))) fa[x]=y,num[e[i].pos]++,tot++;
36     if (tot!=n-1) return puts("0"),0;
37     for (int i=1;i<=n;i++) fa[i]=i;
38     for (int i=1;i<=cnt;i++) if(num[i]){
39         sum=0; dfs(i,st[i],0);
40         for (int j=st[i];j<st[i+1];j++) fa[find(e[j].x)]=find(e[j].y);
41         ans=1LL*ans*sum%Mod;
42     }
43     printf("%d",ans);
44     return 0;
45 }

View Code

转载于:https://www.cnblogs.com/DriverLao/p/7741122.html

BZOJ 1016 最小生成树计数 【模板】最小生成树计数相关推荐

  1. mediapipe KNN 基于mediapipe和KNN的引体向上计数/深蹲计数/俯卧撑计数【mediapipe】【KNN】【BlazePose】【K邻近算法】【python】

    Mediapipe KNN引体向上计数/深蹲计数/俯卧撑计数 引言 功能 说明 步骤 训练样本 获取归一化的`landmarks` 使用KNN算法分类 计数器 入口函数main 过程中遇到的问题 检测 ...

  2. YOLOv5+DeepSORT多目标跟踪与计数精讲(含行人计数和车辆计数)

    使用YOLOv5和DeepSORT对视频中的行人.车辆做多目标跟踪,并进行行人计数和车辆计数 课程链接:https://edu.csdn.net/course/detail/32669 采用先进的YO ...

  3. mediapipe KNN 基于mediapipe和KNN的引体向上计数/深蹲计数/俯卧撑计数【mediapipe】

    原文链接:https://blog.csdn.net/m0_57110410/article/details/125569971 Mediapipe KNN引体向上计数/深蹲计数/俯卧撑计数 引言 功 ...

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

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

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

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

  6. bzoj 1016: [JSOI2008]最小生成树计数【dfs+克鲁斯卡尔】

    有一个性质就是组成最小生成树总边权值的若干边权总是相等的 这意味着按边权排序后在权值相同的一段区间内的边能被选入最小生成树的条数是固定的 所以先随便求一个最小生成树,把每段的入选边数记录下来 然后对于 ...

  7. bzoj 1016 [JSOI2008]最小生成树计数——matrix tree(相同权值的边为阶段缩点)(码力)...

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1016 就是缩点,每次相同权值的边构成的联通块求一下matrix tree.注意gauss里的 ...

  8. BZOJ 1016 最小生成树计数

    需要明确的是 对于图的每一个MST,所有的边权排序后的结果都是一样的. 先求出图中的一个MST,对于图中权值和MST中相同的一些边,可以对MST中的边替换形成新的MST,这种替换的条件是和原来的MST ...

  9. 最小生成树计数模板及原理

    参考于:https://blog.csdn.net/jarily/article/details/8902402 *算法引入: *给定一个含有N个结点M条边的无向图,求它最小生成树的个数t(G); * ...

最新文章

  1. ionic tab导航在android 顶部解决方案
  2. Linux基础知识(1)
  3. python登录系统的实现方法_python实现简单登陆系统
  4. JavaScript 模块化编程(二):AMD规范
  5. linux系统安装redis,外部无法访问
  6. 缓存淘汰算法 LRU
  7. SOCK_STREAM (TCP)、SOCK_DGRAM (UDP)、SOCK_RAW
  8. JS window对象
  9. android 自动调整屏幕分辨率
  10. 大学毕业4年-回顾和总结 10 -资金账务系统的架构设计(产品视角+技术视角)(图文并茂)
  11. SpringCloud Netflix-Eureka使用
  12. centOS 7 安装可视化用户界面
  13. C# 实现视频预览功能(附源码)
  14. 企业应如何选择服务器,既能节省成本又保证性能
  15. 自定义控件---继承ViewGroup类方式(循序渐进之第3步效果----图片左右拖动+RadioGroup切换效果)
  16. MiniLyrics, 非常不错的歌词插件
  17. windows关闭端口
  18. [Android]ProgressBar进度条
  19. JavaScript日记——实现图片的瀑布流和底部刷新
  20. linux文件大小查看

热门文章

  1. 水仙花数(类型:一级、C++)
  2. [转]linux awk命令详解
  3. Matlab 数字图像处理1---图像的收缩和放大
  4. Linux 修改yum 源
  5. LmgORM项目: 介绍
  6. DropDownList的用法
  7. 你知道我们在等你吗?
  8. 【知识小课堂】 之 聚合函数
  9. android 修改包名
  10. AOP—JVM SandBox—快速上手