利用并查集判断一个无向图是否成树

hdu 1272

利用并查集方法,找到各点的根节点。

几点注意:

一、树:1.无环 2.根节点入度为0,其余入度为1

判断依据:

1.若两个点的根节点相同(这两个点是父子关系),则形成环。

2.若所有点中只有一个点的根节点是他本身,则根节点入度为0。

二、

1. 0 0 :空树也是一颗树。

 1 #include<iostream>
 2 #include<algorithm>
 3 #define Max 100005
 4 using namespace std;
 5
 6 int f[Max];
 7
 8 int root(int i)
 9 {
10     if(f[i] == i)
11         return i;
12     else
13         return root(f[i]);
14 }
15 int huan;
16 void U(int a,int b)
17 {
18     int f1,f2;
19     f1 = root(a);
20     f2 = root(b);
21     if(f1 != f2)
22     {
23         f[f1] = f2;
24     }
25     else
26     {
27         huan  = 1;//子环
28     }
29 }
30 int main()
31 {
32     int n,m,i,j,k,t;
33     while(~scanf("%d %d",&n,&m))
34     {
35         huan = 0;
36         memset(f,0,sizeof(f));
37         if(m == -1 && n == -1)
38             break;
39         else if(m == 0 && n == 0)
40         {
41             printf("Yes\n");
42             continue;
43         }
44         else
45         {
46             f[n] = n;
47             f[m] = m;
48             U(n,m);
49         }
50         while(~scanf("%d %d",&n,&m))
51         {
52             if(n == 0 && m == 0)
53                 break;
54             else
55             {
56                 if(f[n] == 0)
57                 {
58                     f[n] = n;
59                 }
60                 if(f[m] == 0)
61                 {
62                     f[m] = m;
63                 }
64                 U(n,m);
65             }
66         }
67         if(huan)
68         {
69             printf("No\n");
70             continue;
71         }
72         k = 0;
73         for(i = 0;i < Max;i ++)
74         {
75             if(f[i] == i && f[i] != 0) //只有一个点的根节点是他本身
76                 k ++;
77         }
78         if(k == 1)
79             printf("Yes\n");
80         else
81             printf("No\n");
82     }
83     return 0;
84 }

C++

时间: 2024-10-11 10:44:47

利用并查集判断一个无向图是否成树的相关文章

利用并查集判断一个有向图是否成树

hdu 1325 此题与hdu 1272类似. 1 #include<stdio.h> 2 #include<string.h> 3 #define N 110000 4 int f[N],vis[N]; 5 int flag = 0; 6 int Maxx = 0; 7 int num = 1; 8 int Max(int a,int b) 9 { 10 return a>b?a:b; 11 } 12 void star1() 13 { 14 int i; 15 for(i

用并查集判断一个无向图中是否存在环

并查集是一种树型的数据结构,用于处理一些不相交集合(Disjoint Sets)的合并及查询问题.常常在使用中以森林来表示.集就是让每个元素构成一个单元素的集合,也就是按一定顺序将属于同一组的元素所在的集合合并. Find:确定元素属于哪一个子集.它可以被用来确定两个元素是否属于同一子集合. Union:将两个子集合并成同一个集合. 其实判断一个图是否存在环已经有相应的算法,此文用并查集来判断一个图是否有环. 我们可以用一个一维数组parent[] 来记录子集合. 看下面这个图: 0 |   \

并查集(判断一个图有几个连通块)

import java.util.Scanner; // 并查集 判断一个图中有几个联通块 public class UnionFind { private int[] father;// private int count;// 分量数量 public UnionFind(int N){ count=N; father=new int[N]; for(int i=0;i<N;i++){ father[i]=i; } } public int count() { return count; }

hdu 5424 回溯+并查集判断连通性

题意:给定一个n个点n条边的无向图,判断是否存在哈密顿路径. 思路:先用并查集判断图是否连通,然后从度数最小的点开始回溯,看是否能找到一条哈密顿路径. 1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 #include <set> 5 using namespace std; 6 7 const int INF = 999999; 8 const int N = 1001; 9

HDU Catch (二分图判断奇环+并查集判断联通)

Problem Description A thief is running away!We can consider the city where he locates as an undirected graph in which nodes stand for crosses and edges stand for streets. The crosses are labeled from 0 to N–1. The tricky thief starts his escaping fro

HDU1558 - Segment set 并查集 + 判断线段相交

HDU1558 - Segment set: http://acm.hdu.edu.cn/showproblem.php?pid=1558 题目大意: 输入一些线段的端点坐标,若两线段相交,则把他们合并成一个集合,输入数据里会有k,问和k线段相交的线段的数目(包括自己) 思路: 每次输入一条线段,都从头扫描一次. 找出之前输入的线段里面,所有和其相交的线段,并且合并(合并用的是线段的ID). 就是: 并查集 + 判断线段相交 代码: #include <iostream> #include &

分别利用并查集,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 如果不明白的话可以画图试试,最多花半个小时,要是早这样不

poj 2513 欧拉回路+并查集判断是否联通+Trie树

http://poj.org/problem?id=2513 最初看到 第一感觉---map  一看250000的数据量 果断放弃 然后记得以前看过,trie代替map,尤其当数据量特别大的时候 学到了: 1.Trie代替map的思想,可以在单词结尾的tree[i][tk]  这个i作为字符串对应的int值 ,当然这个int值也可以用于建立并查集 2.接上,通过并查集判断,所有的点在同一个集合图就是联通的,否则不联通,注意tree[i][tk]>0 表示是单词结尾, x=Find(x);//这句

并查集-判断图的连通

来看一个实例,杭电1232畅通工程 首先在地图上给你若干个城镇,这些城镇都可以看作点,然后告诉你哪些对城镇之间是有道路直接相连的.最后要解决的是整幅图的连通性问题.比如随意给你两个点,让你判断它们是否连通,或者问你整幅图一共有几个连通分支,也就是被分成了几个互相独立的块.像畅通工程这题,问还需要修几条路,实质就是求有几个连通分支.如果是1个连通分支,说明整幅图上的点都连起来了,不用再修路了:如果是2个连通分支,则只要再修1条路,从两个分支中各选一个点,把它们连起来,那么所有的点都是连起来的了:如