并查集主要解决集合的有关运算,主要操作是查找操作和并操作。

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 Tables

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 44039    Accepted Submission(s): 21990

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

杭电ACM省赛集训队选拔赛之热身

#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)的更多相关文章

  1. HDU 1213 How Many Tables(模板——并查集)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1213 Problem Description Today is Ignatius' birthday ...

  2. HDU 1213 - How Many Tables - [并查集模板题]

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1213 Today is Ignatius' birthday. He invites a lot of ...

  3. HDU 1213 How Many Tables(并查集模板)

    http://acm.hdu.edu.cn/showproblem.php?pid=1213 题意: 这个问题的一个重要规则是,如果我告诉你A知道B,B知道C,这意味着A,B,C知道对方,所以他们可以 ...

  4. HDU - 1213 How Many Tables 【并查集】

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1213 题意 给出N个人 M对关系 找出共有几对连通块 思路 并查集 AC代码 #include < ...

  5. HDU 1213 How Many Tables 并查集 水~

    http://acm.hdu.edu.cn/showproblem.php?pid=1213 果然是需要我陪跑T T,禽兽工作人员还不让,哼,但还是陪跑了~ 啊,还有呀,明天校运会终于不用去了~耶耶耶 ...

  6. 并查集---体会以及模板&&How Many Tables - HDU 1213

    定义&&概念: 啥是并查集,就是将所有有相关性的元素放在一个集合里面,整体形成一个树型结构,它支持合并操作,但却不支持删除操作 实现步骤:(1)初始化,将所有节点的父亲节点都设置为自己 ...

  7. HDU 1213 How Many Tables(并查集,简单)

    题解:1 2,2 3,4 5,是朋友,所以可以坐一起,求最小的桌子数,那就是2个,因为1 2 3坐一桌,4 5坐一桌.简单的并查集应用,但注意题意是从1到n的,所以要减1. 代码: #include ...

  8. HDU 1213 How Many Tables (并查集,常规)

    并查集基本知识看:http://blog.csdn.net/dellaserss/article/details/7724401 题意:假设一张桌子可坐无限多人,小明准备邀请一些朋友来,所有有关系的朋 ...

  9. HDU 1213 How Many Tables (并查集)

    How Many Tables 题目链接: http://acm.hust.edu.cn/vjudge/contest/123393#problem/C Description Today is Ig ...

  10. hdu 1213 How Many Tables(并查集练习)

    题目链接:hdu1213 赤裸裸的并查集.....水题一个.... #include<stdio.h> #include<string.h> #include<algor ...

随机推荐

  1. 解决The JSP specification requires that an attribute name is preceded by whitespace问题

    笔者今天调试界面出现下边这个问题: The JSP specification requires that an attribute name is preceded by whitespace 经查 ...

  2. python 模块 optparse

    optparse,是一个能够让程式设计人员轻松设计出简单明了.易于使用.符合标准的Unix命令列程式的Python模块.生成使用和帮助信息. 下面是一个简单的示例: import optparse p ...

  3. 0k6410定时器详细分析

    看到一篇很好的博文,分析2410定时器中断的使用的,很详细,和大家分享一下 转载来源于http://www.cnblogs.com/Neddy/archive/2011/07/01/2095176.h ...

  4. svn add文件名包含@符号的解决方案

    [svn add文件名包含@符号的解决方案] 在iOS开发过程中,代码得用SVN管理起来,但是遇到这么个问题:Default@2x.png文件svn add不成功,总提示找不到这个文件. 结果查了查资 ...

  5. 1-2 开发环境搭建-Windows平台

    C:\Program Files\nodejs\node_modules\npm\npmrc C:\Users\ZHONGZHENHUA\.android\avd H:\heimaandroidadt ...

  6. 运单waybill快速录入

    运单waybill快速录入 前台页面: 1修改页面onAfterEdit事件, 后台代码:ajax响应回请求1 为成功,0 为失败

  7. ROS indigo 删除和安装

    删除比较容易:  sudo apt-get remove ros-jade-desktop-full 但是如果怕删不干净可以采用: sudo apt-get remove ros-*  ,但是不确定会 ...

  8. SpringMVC——概述

    Spring 为展现层提供的基于 MVC 设计理念的优秀的Web 框架,是目前最主流的 MVC 框架之一 Spring3.0 后全面超越 Struts2,成为最优秀的 MVC 框架 Spring MV ...

  9. UML类之间的关系

    原文:http://www.cnblogs.com/me115/p/4092632.html 下面详细介绍这六种关系: 类之间的关系 泛化关系(generalization) 类的继承结构表现在UML ...

  10. C# 关于接口与基类的理解(二者的区别)

    接口(接口的名称一般用大写字母I开头的)是把公共实例(非静态)方法和属性组合起来,以封装特定功能的一个集合.(其实,接口简单理解就是一种约定,使得实现接口的类或结构在形式上保持一致) 注意:使用接口可 ...