P3043 [USACO12JAN]牛联盟(并查集+数学)

(m<n<=1e5,有重边)
题目表述有问题.....
给定一张图(不一定联通),每条边可以选择连接的两个点之一,剩余的点可以自己成对,问方案数。
一开始是真的被吓到了....觉得可写性极低的一题.....
但是两个结论如果推出来的话就蛮好的了
solution:
一开始想:对于每个块进行大小统计,然后组合数乘在一起。但是,有点麻烦:
有环的情况:对于一个联通块有环,那么就会有n个点,n条边,那就意味着会有一个联通块只有一个单独的点。单独考虑环块(下统称环块)

看看这个三元环(误),先确定第一条边选左或右两个点,如果第一个边确定了自己的选择,那么它就会占用下一条边的一个选择的权利,也就是:
如果确定了一条边,就可以确定整个环上的方案数:2
如果不是裸环的环块呢?
看这个:

同上,确定了环上的两个,链的一端就会被占用,也就是说:
只要是环块,对答案的贡献就是2!
(伟大的发现)
考虑无环的情况:
一共n个点,n-1条边(无向图,不能有环就是树),一共有n种方案。感性证明一下(不知道该怎么理性):
最后一个点不被选,而这个不被选的点一共有n种情况,这就是n种方案。
最后根据乘法原理,把所有的方案数乘起来就是ans。
综上结论,题目就变成了:给定一张图,判断联通块大小,找联通块里的环,统计答案
联通块?我有并查集!
找环?我有tarjan!
(旁边两位z姓大佬给我闷头两巴掌,这题还tarjan?你想变成zwjdd长度???)
这里介绍一种无向图判环方法(注意,不是找环,只能判断存在)
还是使用并查集,原理就是在一个联通块内,如果遍历边的次数=点的个数,那么这里就存在环。
貌似是这样哈....我太弱了
代码(注释版):
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+;
const int mod=1e9+;
long long f[maxn],num[maxn],n,m,ans=,c[maxn];
long long find(long long x){return f[x]==x?x:f[x]=find(f[x]);}//被大佬逼的一行冰茶姬
//variable declare:num[]:联通块大小,f[]不解释,c[]联通块内边的数量
int main()
{
scanf("%lld%lld",&n,&m);
for(int i=;i<=n;i++)
f[i]=i,num[i]=;//初始化
for(int i=;i<=m;i++)
{
long long x,y;
scanf("%lld%lld",&x,&y);
long long fa=find(x);
long long fb=find(y);
if(fa!=fb)//合并
{
f[fa]=fb;
num[fb]+=num[fa];//把联通块大小合并
num[fa]=;//清零联通块大小
c[fb]+=c[fa]+;//联通块内多了一条边
}
else
{
c[fb]++;//否则多了一条非树边
}
}
for(int i=;i<=n;i++)
{
if(f[i]==i&&c[i]<num[i])//如果边数没有点数多
ans=ans*num[i]%mod;//统计答案
else if(f[i]==i&&c[i]>=num[i])//否则就是有环,直接*2
ans=(ans<<)%mod;//记得续命
}
printf("%lld",ans);//longlong又出锅了
return ;
}
(完)
P3043 [USACO12JAN]牛联盟(并查集+数学)的更多相关文章
- P3043 [USACO12JAN]牛联盟Bovine Alliance(并查集)
P3043 [USACO12JAN]牛联盟Bovine Alliance 题目描述 Bessie and her bovine pals from nearby farms have finally ...
- 洛谷P3043 [USACO12JAN]牛联盟Bovine Alliance
P3043 [USACO12JAN]牛联盟Bovine Alliance 题目描述 Bessie and her bovine pals from nearby farms have finally ...
- P3043 [USACO12JAN]牛联盟Bovine Alliance——并查集
题目描述 给出n个点m条边的图,现把点和边分组,每条边只能和相邻两点之一分在一组,点可以单独一组,问分组方案数. (友情提示:每个点只能分到一条边,中文翻译有问题,英文原版有这样一句:The cows ...
- BZOJ1051:受欢迎的牛(并查集 / Tarjan)
1051: [HAOI2006]受欢迎的牛 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 8161 Solved: 4460 Description ...
- [USACO12JAN]牛联盟Bovine Alliance
传送门:https://www.luogu.org/problemnew/show/P3043 其实这道题十分简单..看到大佬们在用tarjan缩点,并查集合并.... 蒟蒻渣渣禹都不会. 渣渣禹发现 ...
- HDU 5441 Travel (并查集+数学+计数)
题意:给你一个带权的无向图,然后q(q≤5000)次询问,问有多少对城市(城市对(u,v)与(v,u)算不同的城市对,而且u≠v)之间的边的长度不超过d(如果城市u到城市v途经城市w, 那么需要城市u ...
- BZOJ 2303: [Apio2011]方格染色 [并查集 数学!]
题意: $n*m:n,m \le 10^6$的网格,每个$2 \times 2$的方格必须有1个或3个涂成红色,其余涂成蓝色 有一些方格已经有颜色 求方案数 太神了!!!花我三节课 首先想了一下只有两 ...
- 并查集&线段树&树状数组&排序二叉树
超级无敌巨牛逼并查集(带权并查集)https://vjudge.net/problem/UVALive-4487 带删点的加权并查集 https://vjudge.net/problem/UVA-11 ...
- 【并查集缩点+tarjan无向图求桥】Where are you @牛客练习赛32 D
目录 [并查集缩点+tarjan无向图求桥]Where are you @牛客练习赛32 D PROBLEM SOLUTION CODE [并查集缩点+tarjan无向图求桥]Where are yo ...
随机推荐
- python常用算法学习(3)
1,什么是算法的时间和空间复杂度 算法(Algorithm)是指用来操作数据,解决程序问题的一组方法,对于同一个问题,使用不同的算法,也许最终得到的结果是一样的,但是在过程中消耗的资源和时间却会有很大 ...
- Android开发——RecyclerView实现下载列表
本篇记录的是使用Jsoup框架爬取网页内容,结合Android的RecyclerView,从而实现批量下载小说的功能(也是我的APP星之小说下载器Android版的核心功能),思路仅供参考 本文使用了 ...
- 检测 IP的正则表达式
... /*ip正则表达式*/ /^((?:(?:25[0-5]|2[0-4]\d|((1\d{2})|([1-9]?\d)))\.){3}(?:25[0-5]|2[0-4]\d|((1\d{2})| ...
- 基于STM32F1与NRF24L01模块的SPI简单通信
一.前言 1.简介: 本文是基于STM32F1,将数据发送至NRF模块的寄存器,并将数据重新读取,通过串口发送出来的简单SPI单通信. 2.SPI简介: 调过STM8的都已经对SPI有所了解,调法都一 ...
- js仓库。。。
<script type="text/javascript" src="//ra.revolvermaps.com/0/0/8.js?i=0ln1fndtptz&a ...
- Cocos2d-x 学习笔记(14.1) Event EventCustom EventListener
1. Event EventCustom 所有事件类继承了Event. Event中的枚举,定义了事件的类型: enum class Type { TOUCH, //触摸 KEYBOARD, //键盘 ...
- Spring Boot 入门(七):集成 swagger2
本片文章是基于前一篇写的,<Spring Boot 入门(六):集成 treetable 和 zTree 实现树形图>,本篇主要介绍了spring boot集成swagger2.关于swa ...
- docker-以安装软件的方式介绍docker部分命令的使用
[root@ipha-dev71- docker]# docker search python # 搜索镜像 [root@ipha-dev71- docker]# docker pull centos ...
- ASP.NET Core 3.0 一个 jwt 的轻量角色/用户、单个API控制的授权认证库
目录 说明 一.定义角色.API.用户 二.添加自定义事件 三.注入授权服务和中间件 三.如何设置API的授权 四.添加登录颁发 Token 五.部分说明 六.验证 说明 ASP.NET Core 3 ...
- 百万年薪python之路 -- 并发编程之 多线程 三
1. 阻塞,非阻塞,同步,异步 进程运行的三个状态: 运行,就绪,阻塞. 从执行的角度: 阻塞: 进程运行时,遇到IO了,进程挂起,CPU被切走. 非阻塞: 进程没有遇到IO 当进程遇到IO, ...