bzoj1016 [JSOI2008]最小生成树计数

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

Time Limit: 1 Sec  Memory Limit: 162 MB
Submit: 6032  Solved: 2452
[Submit][Status][Discuss]

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

分析:这道题还是比较坑的......首先我们要利用一条性质:一个图的所有的最小生成树的同一边权的边的数目是相等的,也就是说:我们如果把最小生成树上的边权排序,那么所有最小生成树的排列都是一样的。这个要怎么证明呢?为了简便起见,我们假设有2个不同的边权x1,x2,x1<x2,如果x1有2个,x2有2个,另一个最小生成树x1有3个,x2有1个,那么这是不可能的,因为第二个最小生成树的边权和已经比第一个的小了,如果第二个最小生成树x1有1个,x2有3个,这也不是最小生成树,以此类推,就能证明这个性质(可能不是完全正确的,但是明白这个结论就好了)。

     知道这个结论就比较好处理了。我们接下来要做的就是枚举每个边权满足要求的边数,这里满足的要求是fa[x] != fa[y],也就是构成最小生成树的要求,因为有这个限制,所以不能用组合数,于是我们用dfs,看到了最后是不是达到了我们一开始求的那个最小生成树的边权的边的数目。也就是说:我们以第一个最小生成树为模板,后面的生成树的边权数与第一个相等的边的数目必须相等,同时检测是不是满足要求就可以了。

     有一个坑点:这个图可能不能成为一棵树......

     还有一个坑点:并查集不能用路径压缩,不然dfs不好还原.

     还有一个要注意的地方:我们枚举完一个边权的边后,要把这些边全部连起来,为什么呢,因为这为以后判断下一个边权的边是否满足条件奠定基础.

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>using namespace std;const int mod = 31011;int n, m, fa[1100],cnt,tot,l[1100],r[1100],sum[1100],ans = 1;struct node
{int a, b, c;
}e[1010];bool cmp(node a, node b)
{return a.c < b.c;
}int find1(int x)
{if (x == fa[x])return x;return find1(fa[x]);
}int dfs(int x,int y,int z)
{int res = 0;if (y == r[x] + 1){if (z == sum[x])return 1;return 0;}int fx = find1(e[y].a), fy = find1(e[y].b);if (fx != fy){fa[fx] = fy;res += dfs(x, y + 1, z + 1);res %= mod;fa[fx] = fx;}res += dfs(x, y + 1, z);res %= mod;return res;
}int main()
{scanf("%d%d", &n, &m);for (int i = 1; i <= n; i++)fa[i] = i;for (int i = 1; i <= m; i++)scanf("%d%d%d", &e[i].a, &e[i].b, &e[i].c);sort(e + 1, e + 1 + m, cmp);for (int i = 1; i <= m; i++){if (i == 1)l[++cnt] = 1;elseif (e[i].c != e[i - 1].c){r[cnt] = i - 1;l[++cnt] = i;}int fx = find1(e[i].a), fy = find1(e[i].b);if (fx != fy){fa[fx] = fy;tot++;sum[cnt]++;}}r[cnt] = m;if (tot != n - 1){printf("0\n");return 0;}for (int i = 1; i <= n; i++)fa[i] = i;for (int i = 1; i <= cnt; i++){int tmp = dfs(i,l[i],0);ans = (ans * tmp) % mod;for (int j = l[i]; j <= r[i]; j++){int fx = find1(e[j].a), fy = find1(e[j].b);if (fx != fy)fa[fx] = fy;}}printf("%d\n", ans % mod);return 0;
}

 

转载于:https://www.cnblogs.com/zbtrs/p/7341547.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/252129.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

http请求概述

当浏览器输入网址后 浏览器首先向DNS域名解析服务器发送请求。DNS反解析&#xff1a;根据浏览器请求地址中的域名&#xff0c;到DNS服务器中找到对应的服务器外网IP地址通过找到外网IP&#xff0c;向对应的服务器发请求&#xff08;首先访问服务器的WEB站点管理工具&#xff1a…

Halcon:二维仿射变换实例探究

二维仿射变换&#xff0c;顾名思义就是在二维平面内&#xff0c;对对象进行平移、旋转、缩放等变换的行为&#xff08;当然还有其他的变换&#xff0c;这里仅论述这三种最常见的&#xff09;。 Halcon中进行仿射变换的常见步骤如下&#xff1a; ① 通过hom_mat2d_identity算子…

剑指Offer-数组中重复的数字

题目描述 在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的&#xff0c;但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如&#xff0c;如果输入长度为7的数组{2,3,1,0,2,5,3}&#xff0c;那么对应的…

CSS2--字体样式

## CSS2 字体样式 ##### font-family 字体族 - 规定元素的字体系列 - 把多个字体作为一个"回退"系统保存.保证浏览器的支持 - Microsoft YaHei, tahoma, arial, Hiragino Sans GB, sans-serif ##### font 字体类型 - 衬线字体(serif)&#xff1a;在字的笔划开始及结束…

虚拟机中访问连接在物理机上的摄像机(使用桥接)

最近在使用摄像机SDK做开发&#xff0c;开发好之后物理机上没有环境&#xff0c;所以弄了个虚拟机进行测试&#xff0c;就如何在虚拟机中连接摄像机做下记录。 步骤 &#xff11;.物理机上对虚拟机的适配器和摄像机的适配器设置为相同网段并进行桥接&#xff08;注意与摄像机网…

Halcon:手眼标定——眼在手外与眼在手上

为什么需要九点标定&#xff1f; 为了得到机械和相机的关系&#xff0c;就好比人的手和眼的关系。我们用手将一个物体放到空间的一个位置&#xff0c;用眼看到这个物体&#xff0c;这也存在两个坐标系&#xff0c;一个是手所在的运动空间的坐标系&#xff0c;一个是视网膜上成像…

grep 正则匹配

\{0,n\}&#xff1a;至多n次 \{\ 匹配/etc/passwd文件中数字出现只是数字1次到3次 匹配/etc/grub2.cfg文件以一个空格开头匹配一个字符的文件的所有行 显示以LISTEN结尾的行 显示匹配右边以LISTEN结尾匹配一个或者多个空格的所有输出 分组及引用&#xff1a;讲一个或者多个字符…

解决bash: mysql: command not found 的方法

rootDB-02 ~]# MySQL -u root-bash: mysql: command not found 原因:这是由于系统默认会查找/usr/bin下的命令&#xff0c;如果这个命令不在这个目录下&#xff0c;当然会找不到命令&#xff0c;我们需要做的就是映射一个链接到/usr/bin目录下&#xff0c;相当于建立一个链接文…

C#调用 Halcon引擎执行代码

Halcon引擎可以直接执行halcon代码&#xff0c;把halcon程序当做&#xff23;#的一个方法来调用&#xff0c;这样可以减轻&#xff23;#这边的程序负担&#xff0c;而且可以避免内在泄露等bug的出现。还有一种好处是方便调试视觉代码&#xff0c;你只需要启动halcon&#xff0c…

面试时如何优雅地自我介绍?

阅读本文大概需要 3.4 分钟。 1.题记 有读者提问&#xff1a;如何在面试当中做一个最好的自我介绍&#xff1f; 结合了一下自己面试以及面试别人&#xff08;模拟面试&#xff09;的一些经验&#xff0c;简单总结了几点&#xff0c;供大家参考。 2.为什么要自我介绍 在面试官要…

Cache的一些总结

输出缓存 这是最简单的缓存类型&#xff0c;它保存发送到客户端的页面副本&#xff0c;当下一个客户端发送相同的页面请求时&#xff0c;此页面不会重新生成&#xff08;在缓存有限期内&#xff09;&#xff0c;而是从缓存中获取该页面&#xff1b;当然由于缓存过期或被回收&am…

thinkphp5.0学习(九):TP5.0视图和模板

原文地址&#xff1a;http://blog.csdn.net/fight_tianer/article/details/78602711 一、视图 1.加载页面 1.继承系统控制器类return $this->fetch(参数1&#xff0c;参数2&#xff0c;参数3&#xff0c;参数4);参数1&#xff08;字符串&#xff09;&#xff1a;模板渲染参数…

C#中调用halcon引擎来执行hdev程序

调用halcon引擎有两个直接的好处&#xff1a; 避免C# 与halcon代码混编时可能产生的内存泄露问题 修改halcon程序时不用重新编译C# 勇哥写了一个示例&#xff0c;详细的应用感受和缺点限制勇哥会持续做相关的总结给大家分享。 对于halcon17来说&#xff0c;要运行下面的程序…

Node.js Up and Runing 学习日记(八)

目录 连接池基于一个简单的Socker.io服务器连接池 生产环境通常由多种资源组成: web服务器,缓存服务器和数据库服务器. 数据库服务器通常部署在web服务器之外的独立机器上,这使得面向公众的网站不必重新配置和修改复杂的数据库群就可以垂直增长了. 基于 为每一个请求创建一个甚…

036有效的数独

1 #include "000库函数.h"2 3 //一看&#xff0c;没想出什么好法子&#xff0c;就遍历了4 //最重要的是如何比较小九宫格的数据5 //44ms6 class Solution {7 public:8 bool isValidSudoku(vector<vector<char>>& board) {9 for (int i …

WinAPI——Windows 消息

消息值 注释 WM_NULL$0000 WM_CREATE$0001 WM_DESTROY$0002 WM_MOVE$0003 WM_SIZE$0005 WM_ACTIVATE$0006 WM_SETFOCUS$0007 WM_KILLFOCUS$0008 WM_ENABLE$000A WM_SETREDRAW$000B WM_SETTEXT$000C WM_GETTEXT$000D WM_GETTEXTLENGTH$000E WM_PAINT$000F WM_CLOSE$0010 WM_QUER…

AciveMQ小结|最后有视频

1 JMS 在介绍ActiveMQ之前&#xff0c;首先简要介绍一下JMS规范。 1.1 JMS的基本构件 1&#xff0e;1&#xff0e;1 连接工厂 连接工厂是客户用来创建连接的对象&#xff0c;例如ActiveMQ提供的ActiveMQConnectionFactory。 1&#xff0e;1&#xff0e;2 连接 JMS Connection封…

Build 2016: 发布明天的云创新来服务今天的开发者

每个企业和行业都在被云潜移默化地改变着。随着云计算的速度、规模和灵活性的不断增加&#xff0c;云服务带来的可能性也在不断被拓展。想象一下&#xff0c;通过监测传感器&#xff0c;一位奶农能够将他的奶牛牛奶产量提高&#xff1b;或是一家医院能够自动监测环境卫生状况&a…

禁用JavaScript之后,你的网站表现如何?

禁用JavaScript之后&#xff0c;你的网站表现如何&#xff1f;一最近要做一个新官网&#xff0c;需求评审完之后&#xff0c;考虑到官网都是纯静态页面&#xff0c;功能简单&#xff0c;操起vue-cli3几秒内创建好了项目脚手架&#xff0c;开发前&#xff0c;我打开了首页模板文…

C# 使用 Windows API 操作控件: SendMessage

在C#中&#xff0c;程序采用了的驱动采用了事件驱动而不是原来的消息驱动&#xff0c;虽然.net框架提供的事件已经十分丰富&#xff0c;但是在以前的系统中定义了丰富的消息对系统的编程提供了方便的实现方法&#xff0c;因此在C#中使用消息有时候还是大大提高编程的效率的。定…