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 ...
随机推荐
- Java源码解析|HashMap的前世今生
HashMap的前世今生 Java8在Java7的基础上,做了一些改进和优化. 底层数据结构和实现方法上,HashMap几乎重写了一套 所有的集合都新增了函数式的方法,比如说forEach,也新增了很 ...
- 单元测试实践(SpringCloud+Junit5+Mockito+DataMocker)
网上看过一句话,单元测试就像早睡早起,每个人都说好,但是很少有人做到.从这么多年的项目经历亲身证明,是真的. 这次借着项目内实施单元测试的机会,记录实施的过程和一些总结经验. 项目情况 首先是背景,项 ...
- js仓库。。。
<script type="text/javascript" src="//ra.revolvermaps.com/0/0/8.js?i=0ln1fndtptz&a ...
- Flask-wtforms类似django中的form组件
一.安装 pip3 install wtforms 二.简单使用 1.创建flask对象 from flask import Flask, render_template, request, redi ...
- Web渗透之mssql2005 差异备份getshell
这里记录下mssql2005差异备份拿shell的过程 http://192.168.5.21:81/index.asp?id=1;alter/**/database/**/[asp_test]/** ...
- POJ 1276 Cash Machine(多重背包的二进制优化)
题目网址:http://poj.org/problem?id=1276 思路: 很明显是多重背包,把总金额看作是背包的容量. 刚开始是想把单个金额当做一个物品,用三层循环来 转换成01背包来做.T了… ...
- Python编程系列---Python中装饰器的几种形式及万能装饰器
根据函数是否传参 是否有返回值 ,可以分析出装饰器的四种形式: 形式一:无参无返回值 def outer(func): def wrapper(): print("装饰器功能1" ...
- javascript学习总结之Object.assign()方法详解
最近再写ES6的文章时候发现自己对Object.assign()方法不太了解,之前也没有接触过所以就就查阅了相关的资料,为了自己以后肯能会用到以及对知识进行巩固,所以在这里记录下自己学习的点点滴滴,毕 ...
- Robot Framework——对时间操作的datetime库常用关键字
1.对固定日期进行操作,增加或减去单位时间或者时间段 2.对两个时间段进行操作 3.对时间格式转化,获取时间戳 4.从完整时间中取指定年月日等 5.对时间类型进行格式化 6.获取当前时间或者指定时区时 ...
- 设计模式(九)Bridge模式
Bridge模式就是将类的功能层次结构和类的实现层次结构连接起来. 类的功能层次结构就是根据实际非抽象类来说的,也就是父类具有基本功能,然后在子类中增加新功能.用于增加新功能. 类的实现层次结构就是根 ...