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

题目链接:

http://acm.hdu.edu.cn/showproblem.php?pid=1213

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

题意描述:

输入人数和关系数以及关系

计算并输出有多少个独立团体

解题思路:

处理数据,使用并查集算法即可。

AC代码:

 1 #include<stdio.h>
 2 void merge(int u,int v);
 3 int getf(int v);
 4 int f[1010];
 5 int main()
 6 {
 7     int T,n,m,a,b,i,sum;
 8     scanf("%d",&T);
 9     while(T--)
10     {
11         scanf("%d%d",&n,&m);
12         for(i=1;i<=n;i++)
13             f[i]=i;
14         while(m--)
15         {
16             scanf("%d%d",&a,&b);
17             merge(a,b);
18         }
19
20         for(sum=0,i=1;i<=n;i++)
21         {
22             if(f[i]==i)
23                 sum++;
24         }
25         printf("%d\n",sum);
26     }
27     return 0;
28 }
29 void merge(int u,int v)
30 {
31     int t1,t2;
32     t1=getf(u);
33     t2=getf(v);
34     if(t1 != t2)
35         f[t2]=t1;
36 }
37 int getf(int v)
38 {
39     if(f[v]==v)
40     return v;
41
42     return f[v]=getf(f[v]);
43 }
时间: 2024-12-24 04:18:00

HDU 1213 How Many Tables(模板——并查集)的相关文章

hdu 1213 How Many Tables(并查集算法)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1213 How Many Tables Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 13787    Accepted Submission(s): 6760 Problem Description Today is Ignatius' b

hdu 1213 How Many Tables(并查集的简单应用)

How Many Tables Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 16333    Accepted Submission(s): 8012 Problem Description Today is Ignatius' birthday. He invites a lot of friends. Now it's dinn

HDU 1213 How Many Tables (并查集)

How Many Tables Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 22498 Accepted Submission(s): 11193 Problem Description Today is Ignatius' birthday. He invites a lot of friends. Now it's dinner ti

HDU 1213 How Many Tables(并查集)

传送门 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

HDU 1213 How Many Tables【并查集】

解题思路:和畅通工程类似,问最后还剩下几个不连通的区域. How Many Tables Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 15086    Accepted Submission(s): 7364 Problem Description Today is Ignatius' birthday. He invites a

hdu 1213 How Many Tables(并查集求无向图有几个连通分量)

代码: #include<cstdio> #include<cstring> using namespace std; int n,m; int father[1005]; int Find(int a) { int r=a; while(father[a]!=a) { a=father[a]; } father[r]=a; return a; } void Union(int a,int b) { a=Find(a); b=Find(b); if(a!=b) father[b]=

Hdoj 1213 How Many Tables 【并查集】

How Many Tables Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 16590 Accepted Submission(s): 8117 Problem Description Today is Ignatius' birthday. He invites a lot of friends. Now it's dinner tim

hdu杭电1213 How Many Tables【并查集】

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

[2016-03-15][HDU][1213][How Many Tables]

时间:2016-03-15 16:19:15 星期二 题目编号:[2016-03-15][HDU][1213][How Many Tables] 题目大意:请朋友吃饭,每个朋友都不喜欢和不认识的人在一桌,给出认识的关系,问至少要多少桌 输入: t组数 每组数据 n m m行 u v 表示u 和 v 认识 输出: 最少 分析:并查集,求集合的数目 #ifdef _WORK_ #include <vector> #include <list> #include <map>

HDU 3047 Zjnu Stadium 带权并查集

题目来源:HDU 3047 Zjnu Stadium 题意:给你一些人 然后每次输入a b c 表示b在距离a的右边c处 求有多少个矛盾的情况 思路:用sum[a] 代表a点距离根的距离 每次合并时如果根一样 判断sum数组是否符合情况 根不一样 合并两棵树 这里就是带权并查集的精髓 sum[y] = sum[a]-sum[b]+x 这里y的没有合并前b的根 #include <cstdio> #include <cstring> using namespace std; cons