题目描述

给出n个点m条边的图,现把点和边分组,每条边只能和相邻两点之一分在一组,点可以单独一组,问分组方案数。

(友情提示:每个点只能分到一条边,中文翻译有问题,英文原版有这样一句:The cows in each of the N  farms were initially instructed to build a trail to exactly one other farm)

思路

  这题只要多画一画图,找一找性质就可以了。

  我们先从一条链考虑:

  可以看出,答案显然是四种,即四个点分别是单身狗的情况。

  我们再考虑一棵树:

  

  显然确定了一个点不分到边后,情况就确定了。

  我们得出第一条性质:对于一个n个点,n-1条边的图,答案就是n。

  我们再来考虑环:

  

    还是很显然:确定了一条边的分组后,其它的边的分组也是确定的,答案为2。

  那么我们可以得出:一个联通块的点和边要么是一棵树,要么是一棵基环树,因为如果m>n,是不存在合法方案的。

  我们考虑用并查集来写,分别维护处连通块中的点数和边数,用乘法原理计数即可。

code

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
using namespace std;
const int N=;
const int p=;
int n,m;
struct node
{
int u,v;
}g[N];
int father[N];
int sum1[N],sum2[N]; inline int find(int x){return x==father[x]?x:father[x]=find(father[x]);}
inline int merge(int x,int y)
{
father[y]=x;sum1[x]+=sum1[y];sum2[x]+=sum2[y]+;
sum1[y]=;sum2[y]=;
} int ans=; int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)father[i]=i,sum1[i]=;
for(int i=;i<=m;i++)
{
int x,y;scanf("%d%d",&x,&y);
int r1=find(x),r2=find(y);
if(r1!=r2)merge(r1,r2);
else sum2[r1]++;
}
for(int x=;x<=n;x++)
{
if(x!=find(x))continue;
int r=find(x);
if(sum1[r]==sum2[r])ans=(ans*)%p;
else
{
ans=(long long)ans*sum1[r]%p;
}
}
cout<<ans%p;
}

P3043 [USACO12JAN]牛联盟Bovine Alliance——并查集的更多相关文章

  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. [USACO12JAN]牛联盟Bovine Alliance

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

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

    (m<n<=1e5,有重边) 题目表述有问题..... 给定一张图(不一定联通),每条边可以选择连接的两个点之一,剩余的点可以自己成对,问方案数. 一开始是真的被吓到了....觉得可写性极 ...

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

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

  6. BZOJ4998星球联盟——LCT+并查集(LCT动态维护边双连通分量)

    题目描述 在遥远的S星系中一共有N个星球,编号为1…N.其中的一些星球决定组成联盟,以方便相互间的交流.但是,组成 联盟的首要条件就是交通条件.初始时,在这N个星球间有M条太空隧道.每条太空隧道连接两 ...

  7. 【bzoj4998】星球联盟 LCT+并查集

    题目描述 在遥远的S星系中一共有N个星球,编号为1…N.其中的一些星球决定组成联盟,以方便相互间的交流.但是,组成联盟的首要条件就是交通条件.初始时,在这N个星球间有M条太空隧道.每条太空隧道连接两个 ...

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

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

  9. 牛客练习赛16 C 任意点【并查集/DFS/建图模型】

    链接:https://www.nowcoder.com/acm/contest/84/C 来源:牛客网 题目描述 平面上有若干个点,从每个点出发,你可以往东南西北任意方向走,直到碰到另一个点,然后才可 ...

随机推荐

  1. redis系列之------字典

    前言 字典, 又称符号表(symbol table).关联数组(associative array)或者映射(map), 是一种用于保存键值对(key-value pair)的抽象数据结构. 在字典中 ...

  2. 前端深入之css篇丨2020年前,彻底掌握css动画【transition】

    写在前面 马上就2020年了,不知道小伙伴们今年学习了css3动画了吗? 说起来css动画是一个很尬的事,一方面因为公司用css动画比较少,另一方面大部分开发者习惯了用JavaScript来做动画,所 ...

  3. 神奇的Java僵尸(defunct)进程问题排查过程

    现象描述 大概1个月多以前 在启动脚本中增加了tail -f 用来启动后追踪日志判断是否启动成功 后发现无法执行shutdown.sh(卡住 利用curl) 然后无奈使用kill -9 但通过ps - ...

  4. 线程封闭之栈封闭和ThreadLocal

    线程封闭 在多线程的环境中,我们经常使用锁来保证线程的安全,但是对于每个线程都要用的资源使用锁的话那么程序执行的效率就会受到影响,这个时候可以把这些资源变成线程封闭的形式. 1.栈封闭 所谓的栈封闭其 ...

  5. SQL注入靶场sqli-labs 1-65关全部通关教程

    以前说好复习一遍 结果复习到10关就没继续了 真是废物 一点简单的事做不好 继续把以前有头没尾的事做完 以下为Sqli-lab的靶场全部通关答案 目录: less1-less10 less10-les ...

  6. 关于seaJs合并压缩(gulp-seajs-combine )路径与文件ID匹配问题。

    前段时间和有大家介绍过用 gulp-seajs-combine 来打包seaJs文件.大家会发现合并seaJs一个很奇怪的现象,那就是它的 ID和路径匹配原则.使得有些文件已经合并过去了,但还是会提示 ...

  7. 原生无缝Banner轮播图

    话不多说,先展示效果图.由于录制工具,稍显卡顿,实际是流畅的.可以看到实现了无缝轮播,鼠标悬停,点击左右上下按钮切换Banner的功能,如图1所示. 图1 原生无缝banner效果展示 以我这个轮播图 ...

  8. Spring Cloud Alibaba (nacos 注册中心搭建)

    [nacos下载地址](https://github.com/alibaba/nacos/releases) ### 什么是 Nacos? - nacos主要起到俩个作用一个是注册中心,另外一个是配置 ...

  9. java集合第一节,List简单介绍

    Java中List集合的常用方法   List接口是继承Collection接口,所以Collection集合中有的方法,List集合也继承过来. package 集合; import java.ut ...

  10. typescript 入门教程二

    ts中面向对象成员修饰符:public , private , protexted(ts官方网站:ts) 在ts中,默认的成员修饰符就是public public:是表示是公开的,在任何地方,都可以调 ...