P3043 [USACO12JAN] Bovine Alliance G

news/2024/10/6 19:09:32/文章来源:https://www.cnblogs.com/FireRaku/p/18290719

P3043 [USACO12JAN] Bovine Alliance G

并查集

每个连通块方案数独立。考虑一个连通块的情况,显然如果 \(m>n\) 一定无解,那么就只有 \(m=n\)\(m=n-1\) 两种情况,前者是基环树,后者是树。

基环树的环上,第一条边选择的端点确定,其他也就确定,共有两种情况。环下的树选择固定。所有总方案数为 \(2\) 种。

树上所有边的端点选择完后,会剩下唯一的节点,将这个节点作为根,那么子树的选择也是固定的。由于这唯一的节点任意,所以方案数就是连通块的节点数。

那么就可以维护连通块内边数和点数计算答案了,用并查集即可。

复杂度 \(O(n\log n)\)

#include <bits/stdc++.h>
#define pii std::pair<int, int>
#define mk std::make_pair
#define fi first
#define se second
#define pb push_backusing i64 = long long;
using ull = unsigned long long;
const i64 iinf = 0x3f3f3f3f, linf = 0x3f3f3f3f3f3f3f3f;
const int N = 1e5 + 10, mod = 1e9 + 7;
int n, m;
i64 ans = 1;
int fa[N], cnt[N], sz[N];
int find(int x) {if(x != fa[x]) fa[x] = find(fa[x]);return fa[x];
}
void merge(int x, int y) {int fx = find(x), fy = find(y);if(fx == fy) cnt[fy]++;else {fa[fx] = fy, cnt[fy] += cnt[fx] + 1;sz[fy] += sz[fx];}
}
int vis[N];
int main() {std::ios::sync_with_stdio(false);std::cin.tie(nullptr);std::cin >> n >> m;for(int i = 1; i <= n; i++) fa[i] = i, sz[i] = 1;for(int i = 1; i <= m; i++) {int u, v;std::cin >> u >> v;merge(u, v);}for(int i = 1; i <= n; i++) {int x = find(i);if(!vis[x]) {if(cnt[x] > sz[x]) ans = 0;else if(cnt[x] == sz[x]) ans = ans * 2 % mod;else ans = ans * sz[x] % mod;vis[x] = 1;}}std::cout << ans << "\n";return 0;
}

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

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

相关文章

matlab中神经网络预测模型的调用

本章以一道多自变量的例题来表述如何用调用matlab的包进行神经网络预测 目录一、问题提出二、训练集,验证集和测试集三、使用神经网络进行训练1.导入数据2.选择训练方法四、结果解读1.性能图2.回归图3.训练方法比较4.保存结果五、进行预测 一、问题提出 如图所示,现在有401个…

常见的排序算法——堆排序

本文记述了堆排序的基本思想和一份参考实现代码,并在说明了算法的性能后用随机数据进行了验证。 ◆ 思想 J.W.J Williams 提出了堆排序的算法,该算法利用了二叉堆有序的性质,将排序的过程分为先构建堆再排序的两个阶段。 先构建堆。从当前待排序范围一半的位置开始向第一个位…

vulnhub - JIS-CTF

泡面机vulnhub - JIS-CTF 这个靶场一共有5个flag 信息收集 靶机ip:192.168.157.172 kali ip:192.168.157.161 nmap 192.168.157.0/24 nmap -sT --min-rate 10000 -p- 192.168.157.172 sudo nmap -sT -sV -sC -O -p22,80 192.168.157.172一眼看到robots.txt User-agent: * Dis…

暑假进度表

7.8 个人赛打的还可以,就是F题敲得太慢了,最后差十分钟做出来。 补了一个重要但是原来没注意到的一个知识点 \(01bfs\) ,做了四道相关题,将F题写进了双端队列的内容中,感觉非常不错的一题。

私有云盘-可道云-安装和使用和数据迁移

私有云盘是什么 随着云计算和移动办公大潮的到来,iPad、智能手机等家庭联网设备不断增多,以及搭载小容量SSD笔记本电脑的流行,能够跨平台分享的个人云服务需求不断增长;而今天的个人云服务也已经极大丰富,从2TB的百度网盘到商务人士中流行的Dropbox和Box个人云,不但免费,…

比赛获奖的武林秘籍:04 电子类比赛嵌入式开发快速必看的上手指南

本文主要介绍了电子类比赛中负责嵌入式开发同学的上手比赛的步骤、开发项目的流程和具体需要学习的内容,并结合自身比赛经历给出了相关建议。比赛获奖的武林秘籍:04 电子类比赛嵌入式开发快速必看的上手指南 摘要 本文主要介绍了电子类比赛中负责嵌入式开发同学的上手比赛的步…

线程饥饿问题——b2b - Thread starvation or clock leap detected (housekeeper delta=5h28m19s393ms972......

原因:在方法上配置了 @Async 注解进行异步执行,但是没有在主配置类上配置 @EnableAsync 启动异步执行。 修改前 修改后

SpringBoot项目启动,运行停留在标题处

详情: 原因:yml文件存在问题,比如:在切换生产环境和开发环境的配置文件时,yml名称写错,如下,图,此处多写了一个p。解决办法:修改为正确的配置文件,即可。

git合并代码方法

你合并代码用 merge 还是用 rebase ? macrozheng 2024年07月08日 14:10 江苏 1人听过以下文章来源于古时的风筝 ,作者风筝古时的风筝. 写代码是一种爱好,写文章是一种情怀。mall学习教程官网:macrozheng.com 你们平时合并代码的时候用 merge 还是 rebase? 我问了一圈,发现…

秒杀圣经(2):10Wqps秒杀,16大架构绝招,一文帮你秒变架构师

文章很长,且持续更新,建议收藏起来,慢慢读!疯狂创客圈总目录 博客园版 为您奉上珍贵的学习资源 : 免费赠送 :《尼恩Java面试宝典》 持续更新+ 史上最全 + 面试必备 2000页+ 面试必备 + 大厂必备 +涨薪必备 免费赠送 :《尼恩技术圣经+高并发系列PDF》 ,帮你 实现技术自由,…

写入多维表格失败

原因一: 没有获取到正确的table_id 解决办法将多维表格在浏览器打开,url的这部分就是table_id,如下图。由于模板中的设置多维表格模块需要输入网址,所以建议将网址和table_id一起复制

【算法篇】KMP算法,一种高效的字符串匹配算法

我们今天了解一个字符串匹配算法-KMP算法,内容难度相对来说较高,建议先收藏再细品!!! KMP算法我们今天了解一个字符串匹配算法-KMP算法,内容难度相对来说较高,建议先收藏再细品!!!KMP算法的基本概念 KMP算法是一种高效的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.…