(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]牛联盟(并查集+数学)的更多相关文章

  1. P3043 [USACO12JAN]牛联盟Bovine Alliance(并查集)

    P3043 [USACO12JAN]牛联盟Bovine Alliance 题目描述 Bessie and her bovine pals from nearby farms have finally ...

  2. 洛谷P3043 [USACO12JAN]牛联盟Bovine Alliance

    P3043 [USACO12JAN]牛联盟Bovine Alliance 题目描述 Bessie and her bovine pals from nearby farms have finally ...

  3. P3043 [USACO12JAN]牛联盟Bovine Alliance——并查集

    题目描述 给出n个点m条边的图,现把点和边分组,每条边只能和相邻两点之一分在一组,点可以单独一组,问分组方案数. (友情提示:每个点只能分到一条边,中文翻译有问题,英文原版有这样一句:The cows ...

  4. BZOJ1051:受欢迎的牛(并查集 / Tarjan)

    1051: [HAOI2006]受欢迎的牛 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 8161  Solved: 4460 Description ...

  5. [USACO12JAN]牛联盟Bovine Alliance

    传送门:https://www.luogu.org/problemnew/show/P3043 其实这道题十分简单..看到大佬们在用tarjan缩点,并查集合并.... 蒟蒻渣渣禹都不会. 渣渣禹发现 ...

  6. HDU 5441 Travel (并查集+数学+计数)

    题意:给你一个带权的无向图,然后q(q≤5000)次询问,问有多少对城市(城市对(u,v)与(v,u)算不同的城市对,而且u≠v)之间的边的长度不超过d(如果城市u到城市v途经城市w, 那么需要城市u ...

  7. BZOJ 2303: [Apio2011]方格染色 [并查集 数学!]

    题意: $n*m:n,m \le 10^6$的网格,每个$2 \times 2$的方格必须有1个或3个涂成红色,其余涂成蓝色 有一些方格已经有颜色 求方案数 太神了!!!花我三节课 首先想了一下只有两 ...

  8. 并查集&线段树&树状数组&排序二叉树

    超级无敌巨牛逼并查集(带权并查集)https://vjudge.net/problem/UVALive-4487 带删点的加权并查集 https://vjudge.net/problem/UVA-11 ...

  9. 【并查集缩点+tarjan无向图求桥】Where are you @牛客练习赛32 D

    目录 [并查集缩点+tarjan无向图求桥]Where are you @牛客练习赛32 D PROBLEM SOLUTION CODE [并查集缩点+tarjan无向图求桥]Where are yo ...

随机推荐

  1. python编程基础之二十七

    列表生成式:[exp for iter_var in iterable] 同样也会有字典生成式,集合生成式,没有元组生成式,元组生成式的语法被占用了 字典生成式,集合生成式,就是外面那个括号换成{}  ...

  2. Be Nice!要善良

    [1]  It is nice to be important, but it is more important to be nice. [2]  What simple act of kindne ...

  3. 深入理解 web 协议(一)- http 包体传输

    本文首发于 vivo互联网技术 微信公众号 链接:https://mp.weixin.qq.com/s/WlT8070LlrnSODFRDwZsUQ作者:吴越 开坑这个系列的原因,主要是在大前端学习的 ...

  4. php的cookie怎么使用

    PHP中Cookie的使用---添加/更新/删除/获取Cookie 及 自动填写该用户的用户名和密码和判断是否第一次登陆 什么是cookie? 服务器在客户端保存用户的信息,比如登录名,密码等. 这些 ...

  5. SpringCloud之RefreshScope 源码解读

    SpringCloud之RefreshScope @Scope 源码解读 Scope(org.springframework.beans.factory.config.Scope)是Spring 2. ...

  6. 2019.10.26 CSP%您赛第三场

    \(CSP\)凉心模拟^_^ --题源\(lqx.lhc\)等各位蒟蒻 题目名称 比赛 传递消息 开关灯 源文件名 \(competition.cpp\) \(message.cpp\) \(ligh ...

  7. (一)如何理解java面向对象编程

    哲学中,事物总是螺旋式上升,波浪式前进.因而编程也逐渐向人类更容易理解的方向前进,多年来人们苦苦追求的编程境界 : 高扩展性(extensibility),高复用性(reuseable).java语言 ...

  8. @RequestParam设置默认可以传空值

    设置如下:@RequestParam(value="CbqkJson[]",required=false)String[] CbqkJson required=false 如果不设 ...

  9. 你真的了解 volatile 关键字吗?

    今天,让我们一起来探讨 Java 并发编程中的知识点:volatile 关键字 本文主要从以下三点讲解 volatile 关键字: volatile 关键字是什么? volatile 关键字能解决什么 ...

  10. unity发布ios高通AR的问题

    1)缺少引用,无法找到vuforiaBehavior 原因:Windows下的工程,直接考到mac下,导致unity自带插件(2017)有问题 解决:首先在playerSettings-xrSetti ...