并查集简述 (HDU-1213-How Many Tables)
并查集主要解决集合的有关运算,主要操作是查找操作和并操作。
1、集合的储存方式。
为便于查找,集合通常以树结构储存,每个元素分 数据域和指针域,可以用链式储存,也可以用结构数组储存,用根节点来表示一个集合。这个性质也决定了集合中是子节点指向父节点。
typedef struct
{
ElementType Data;
int Parent;
}SetType;
| 下标 | Data | Parent |
| 0 | 1 | -1 |
| 1 | 2 | 0 |
| 2 | 3 | -1 |
| 3 | 4 | 0 |
| 4 | 5 | 2 |
| 5 | 6 | -1 |
| 6 | 7 | 0 |
| 7 | 8 | 2 |
| 8 | 9 | 5 |
| 9 | 10 | 5 |
负数表示根节点,非负数表示父节点的下标
2、集合的查找。
集合既然用根节点表示,查找某元素所在的集合也就可以用集合表示了。
int Find ( SetType *S, ElementType X )
{
int i = 0;
while( i<MaxSize && S[i].Data != X )
i++;
if( i >= MaxSize ) return ERROR;
while( S[i].Parent >= 0 )
i = S[i].Parent ;
return i;
}
3、集合的并。
将x1和x2所在的集合并在一起,就是将根节点并在一起,当然前提是他们本来就不属于同一集合。
void Union ( SetType *S, ElementType X1, ElementType X2 )
{
int Root1, Root2;
Root1 = Find ( S, X1 );
Root2 = Find ( S, X2 );
if( Root1 != Root2 )
S[Root2].Parent = Root1;
}
上题:
How Many TablesTime Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Problem Description Today is Ignatius' birthday. He invites a lot of friends. Now it's dinner time. Ignatius wants to know how many tables he needs at least. You have to notice that not all the friends know each other, and all the friends do not want to stay with strangers. One important rule for this problem is that if I tell you A knows B, and B knows C, that means A, B, C know each other, so they can stay in one table. For example: If I tell you A knows B, B knows C, and D knows E, so A, B, C can stay in one table, and D, E have to stay in the other one. So Ignatius needs 2 tables at least. Input The input starts with an integer T(1<=T<=25) which indicate the number of test cases. Then T test cases follow. Each test case starts with two integers N and M(1<=N,M<=1000). N indicates the number of friends, the friends are marked from 1 to N. Then M lines follow. Each line consists of two integers A and B(A!=B), that means friend A and friend B know each other. There will be a blank line between two cases. Output For each test case, just output how many tables Ignatius needs at least. Do NOT print any blanks. Sample Input 2 5 3 1 2 2 3 4 5 5 1 2 5 Sample Output 2 4 Source |
#include <iostream>
using namespace std;
typedef int ElementType;
typedef struct
{
ElementType Data;
int Parent;
}SetType;
SetType S[1001];
int MaxSize;
int Find ( SetType *S, ElementType X )
{
int i = 0;
while( i<MaxSize && S[i].Data != X )
i++;
while( S[i].Parent >= 0 )
i = S[i].Parent ;
return i;
}
void Union ( SetType *S, ElementType X1, ElementType X2 )
{
int Root1, Root2;
Root1 = Find ( S, X1 );
Root2 = Find ( S, X2 );
if( Root1 != Root2 )
S[Root2].Parent = Root1;
}
int main()
{
int t;
cin >> t;
while ( t-- )
{
int num = 0;
int n, m, i;
cin >> n >> m;
for( i=0; i<n; i++ )
{
S[i].Parent = -1;
S[i].Data = i + 1;
}
MaxSize = n;
for( i=0; i<m; i++ )
{
int a, b;
cin >> a >> b;
Union( S, a, b );
}
for( i=0; i<n; i++ )
{
if(S[i].Parent == -1)
num++;
}
cout << num << endl;
}
return 0;
}
并查集简述 (HDU-1213-How Many Tables)的更多相关文章
- HDU 1213 How Many Tables(模板——并查集)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1213 Problem Description Today is Ignatius' birthday ...
- HDU 1213 - How Many Tables - [并查集模板题]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1213 Today is Ignatius' birthday. He invites a lot of ...
- HDU 1213 How Many Tables(并查集模板)
http://acm.hdu.edu.cn/showproblem.php?pid=1213 题意: 这个问题的一个重要规则是,如果我告诉你A知道B,B知道C,这意味着A,B,C知道对方,所以他们可以 ...
- HDU - 1213 How Many Tables 【并查集】
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1213 题意 给出N个人 M对关系 找出共有几对连通块 思路 并查集 AC代码 #include < ...
- HDU 1213 How Many Tables 并查集 水~
http://acm.hdu.edu.cn/showproblem.php?pid=1213 果然是需要我陪跑T T,禽兽工作人员还不让,哼,但还是陪跑了~ 啊,还有呀,明天校运会终于不用去了~耶耶耶 ...
- 并查集---体会以及模板&&How Many Tables - HDU 1213
定义&&概念: 啥是并查集,就是将所有有相关性的元素放在一个集合里面,整体形成一个树型结构,它支持合并操作,但却不支持删除操作 实现步骤:(1)初始化,将所有节点的父亲节点都设置为自己 ...
- HDU 1213 How Many Tables(并查集,简单)
题解:1 2,2 3,4 5,是朋友,所以可以坐一起,求最小的桌子数,那就是2个,因为1 2 3坐一桌,4 5坐一桌.简单的并查集应用,但注意题意是从1到n的,所以要减1. 代码: #include ...
- HDU 1213 How Many Tables (并查集,常规)
并查集基本知识看:http://blog.csdn.net/dellaserss/article/details/7724401 题意:假设一张桌子可坐无限多人,小明准备邀请一些朋友来,所有有关系的朋 ...
- HDU 1213 How Many Tables (并查集)
How Many Tables 题目链接: http://acm.hust.edu.cn/vjudge/contest/123393#problem/C Description Today is Ig ...
- hdu 1213 How Many Tables(并查集练习)
题目链接:hdu1213 赤裸裸的并查集.....水题一个.... #include<stdio.h> #include<string.h> #include<algor ...
随机推荐
- powerdesigner Oracle.sql转mysql.sql
将要导入的库的所有表的表结构(不要表数据,只要表结构)导出成一个.sql文件. 在PowerDesinger里找到 File -->> Reverse Engineer --->&g ...
- 安装saltstack-web管理界面
1.安装salt-master.salt-minion和salt-api $ sudo yum install epel-release -y $ sudo yum install salt-mast ...
- day63-webservice 01.cxf介绍
CXF功能就比较强了.CXF支持soap1.2.CXF和Spring整合的非常密切.它的配置文件基本就是Spring的配置文件了.CXF是要部署在服务器才能用的.CXF得放到Web容器里面去发布.CX ...
- GCC笔记(警告.优化以及调试选项)
GCC提供了大量的警告选项,对代码中可能存在的问题提出警告,通常可以使用-Wall来开启以下警告: -Waddress -Warray-bounds (only with -O2) -Wc++0x-c ...
- 【总结整理】微信产品-张小龙-PM学习总结
伟大的产品可以满足人类的情感需求.找到需求背后的心理诉求产品的终极目标是满足任性需求,不在产品中掺杂自己的道德感.“我有个好主意”,往往都是脱离用户需求的. 1,不直接满足用户需求2,用户需求是零散的 ...
- ubuntu14.04 使用笔记
这是第二次安装使用ubuntu了,虽然上一次因为不习惯和不会使用一两天就放弃了,这次坚持的时间稍微长一点,目前ubuntu的基本使用也熟悉了.但是由于ubuntu上的应用太少,常用软件,比如QQ,Ph ...
- 434. Number of Segments in a String 字符串中的单词个数
[抄题]: Count the number of segments in a string, where a segment is defined to be a contiguous sequen ...
- 新浪SAE高级开发者认证通过
如题,新浪SAE高级开发者认证通过,申请的方式为提交开源项目地址,用的是如下的项目 http://jqext.sinaapp.com/ 之前该项目是部署在 mopaas 上的,在拿到高级开发者资格后迁 ...
- getopt两个模块getopt 和gun_getopt 的异同
getopt的两个模块getopt和gun_getopt都可以接收参数,但是又有不同; 先看 getopt.getopt这个模块: import sys import getopt def main( ...
- bzoj5392 [Lydsy1806月赛]路径统计
传送门 分析 我们设sum[x]为小于等于x的点现在有多少联通 于是一个序列合法当且只当sum[R]-sum[L-1]=len且所有点度数不大于2 我们知道如果对于序列[L,R]满足条件则[L+1,R ...