EOJ 1816 并查集的的简单应用——判断图联通

题目:eoj1816

题目分析:判断图是否连通,可用dfs遍历图算法。这里我采用的是并查集的方法。初始化时将每个节点看作一个集合,则每给出一条边即把两个集合合并。最后遍历所有点,有几个集合便有几个连通分量,若只有一个集合说明图连通。

AC代码:

#include <iostream>

#include <cstdio>

#include <cstring>

#include <cmath>

#include <string>

#include <vector>

#include <map>

#include <algorithm>

using namespace std;

int set[1000005];

int find(int x){

returnx==set[x]?x:(set[x]=find(set[x]));

}

int main()

{

int n,m,i,x,y;

scanf("%d%d",&n,&m);

for(i=1;i<1000005;++i)

set[i]=i;

for(i=0;i<m;++i){

int a,b;

scanf("%d%d",&a,&b);

int fx=find(a),fy=find(b);

set[fx]=fy;

}

int cnt=0;

for(i=1;i<=n;++i)

if(set[i]==i)

++cnt;

if(cnt==1)

printf("yes\n");

else printf("no\n");

return 0;

}

时间: 2024-10-20 01:44:13

EOJ 1816 并查集的的简单应用——判断图联通的相关文章

分别利用并查集,DFS和BFS方法求联通块的数量

联通块是指给定n个点,输入a,b(1<=a,b<=n),然后将a,b连接,凡是连接在一起的所有数就是一个联通块: 题意:第一行输入n,m,分别表示有n个数,有输入m对连接点,以下将要输入m行(输入数据到文件截止): 输出:第一行要求输出联通块的个数,并在第二行分别输出每个联通块中点的数量,每个数之间以一个空格隔开. 样例 15 31 42 53 5输出:2 2 3样列2 9 81 22 33 43 74 54 67 87 9输出: 19 如果不明白的话可以画图试试,最多花半个小时,要是早这样不

一笔画问题 南阳oj42 【并查集+欧拉通路的判断】

描述 zyc从小就比较喜欢玩一些小游戏,其中就包括画一笔画,他想请你帮他写一个程序,判断一个图是否能够用一笔画下来. 规定,所有的边都只能画一次,不能重复画. 输入 第一行只有一个正整数N(N<=10)表示测试数据的组数. 每组测试数据的第一行有两个正整数P,Q(P<=1000,Q<=2000),分别表示这个画中有多少个顶点和多少条连线.(点的编号从1到P) 随后的Q行,每行有两个正整数A,B(0<A,B<P),表示编号为A和B的两点之间有连线. 输出 如果存在符合条件的连线

今天做题做到了并查集相关的内容~简单介绍一下关于并查集的东西

就例如一个非常简单的题~ 有一堆人 其中某些人是朋友 有如下的规则 如果A和B是朋友 B和C是朋友 那么A和C也是朋友~ 最后我们有n次的查询 每次查询问其中两个人是不是朋友? 这个题我们就可以用到集合的思想~ 例如A和B是朋友 我们可以把A和B放到一个集合里~ C和D是朋友 我们就把C和D放到一个集合里~ 如图 (原谅只会人工画图的笨比) 但如果我们假设A和C也是好朋友 我们就把这两个集合合并起来~ 就是这个样子~我们对所有的“朋友对”进行这样的操作 就会把他们分到一个个集合里 这时候查找他们

并查集基础(入门)

最早接触并查集的时候是在做一道最小生成树问题上,当时还不会并查集,题解说用克鲁斯卡尔算法,用并查集来维护,就能够完成最小生成树. 并查集是什么呢?其实,并查集就是一个集合,它有两种操作,一个是合并(merge),一个是查找(getf). 合并就是说把具有相同祖先的集合合并成 为一个集合,查找就是说,查找某些具有相同祖先的集合.当然这个祖先只是我这样叫的(他其实并不是名义上的祖先),很多时候我们会维护很多 这样的信息,比如说,在求最小生成树的算法中,我们维护的是检查两个顶点是否属于同一个集合,也就

【kuangbin带你飞】 专题五 并查集

A:简单并查集 B:简单并查集 C:简单并查集 D:带权并查集.注意带权并查集要在路径压缩和合并两处地方与一般并查集不同. 见神图 E:经典食物链,见神图 F: G: H:带权并查集,见神图 I: J:带权并查集,带权并查集 见神图 K: L: M:并查集 N:判断是否是一棵树.并查集 神图: 膜拜bin神orz...

Is It A Tree?------HDOJ杭电1325(两种方法,可以用也可以不用并查集!!!!!!详解)

Problem Description A tree is a well-known data structure that is either empty (null, void, nothing) or is a set of one or more nodes connected by directed edges between nodes satisfying the following properties. There is exactly one node, called the

并查集及应用

在信息学竞赛中,并查集是一种不可忽视的一部分内容,把最近几年的NOI和NOIP复赛题目大致浏览了一遍,发现有好几道应用并查集的题目,因此本文由浅入深的介绍并查集在编程中的巧妙应用. 什么是并查集?并查集是一种树型的数据结构,用于处理一些不相交集合(Disjoint Sets)的合并及查询问题.常常在使用中以森林来表示.集就是让每个元素构成一个单元素的集合,并就是按一定顺序将属于同一组的元素所在的集合合并. 并查集的主要操作: 1.初始化:把每个点所在集合初始化为其自身: 2.查找:查找元素所在的

数据结构--并查集的原理及实现

一,并查集的介绍 并查集(Union/Find)从名字可以看出,主要涉及两种基本操作:合并和查找.这说明,初始时并查集中的元素是不相交的,经过一系列的基本操作(Union),最终合并成一个大的集合. 而在某次合并之后,有一种合理的需求:某两个元素是否已经处在同一个集合中了?因此就需要Find操作. 并查集是一种 不相交集合 的数据结构,设有一个动态集合S={s1,s2,s3,.....sn},每个集合通过一个代表来标识,该代表中集合中的某个元素. 比如,若某个元素 x 是否在集合 s1 中(Fi

bzoj4195 [Noi2015]程序自动分析——并查集

题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4195 突然在这道大水题上WA了半天... 思路很简单,离线处理询问,先把 = 的都加到并查集里,再暴力判断 != 的: 然而WA了许多遍...对离散化还是太不熟悉了... 1.fa[] 数组的预处理!平时写的手熟,上来就 for(i=1;i<=n;i++),完全忘了离散化后怎样怎样了啊!! 2. unique 的时候需要 -1! 3. lower_bound 时不要多 -1! 代码如下: