並查集的應用:hdu 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.
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程式碼:
# include <stdio.h>
int group[1005];
int depth[1005];
void init()//初始化組別
{
int i;
for (i = 0; i < 1005; i ++)
{
group[i] = i;
depth[i] = 1;
}
}
int find(int e) //查詢根並把同組的都連到根部
{
if (group[e] == e)
{
return e;
}
else
{
return group[e] = find(group[e]);
}
}
void unite(int e1, int e2) //連線兩個不同的組
{
e1 = find(e1);
e2 = find(e2);
if (depth[e1] < depth[e2]) //把樹的深度小 的連線到深度大的
{
group[e1] = e2;
}
else
{
group[e2] = e1;
if (depth[e1] == depth[e2])
{
depth[e1] ++;
}
}
}
int main(void)
{
int t;
scanf("%d", &t);
while (t--)
{
int n, m;
int i;
int count = 0;
init();
scanf("%d %d", &n, &m);
for (i = 1; i <= m; i++)
{
int head, tail;
scanf("%d %d", &head, &tail);
unite(head, tail);
}
for (i = 1; i <= n; i++)
{
if (group[i] == i)
{
count++;
}
}
printf("%d\n", count);
}
return 0;
}
相關文章
- 並查集應用並查集
- 並查集的應用2並查集
- 並查集深度應用並查集
- 並查集的簡單應用並查集
- 並查集(二)並查集的演算法應用案例上並查集演算法
- 並查集擴充套件應用並查集套件
- HDU1213-How Many Tables
- 並查集經典應用場景並查集
- 【學習筆記】並查集應用筆記並查集
- 【帶權並查集】理論和應用並查集
- 並查集在實際問題中的應用並查集
- 【並查集】【帶偏移的並查集】食物鏈並查集
- 並查集到帶權並查集並查集
- 並查集(一)並查集的幾種實現並查集
- 並查集的使用並查集
- 查並集
- 並查集演算法Union-Find的思想、實現以及應用並查集演算法
- 並查集(小白)並查集
- [leetcode] 並查集(Ⅱ)LeetCode並查集
- [leetcode] 並查集(Ⅲ)LeetCode並查集
- [leetcode] 並查集(Ⅰ)LeetCode並查集
- 3.1並查集並查集
- 寫模板, 並查集。並查集
- 並查集跳躍並查集
- 各種並查集並查集
- 淺談並查集並查集
- 食物鏈(並查集)並查集
- 並查集(Union Find)並查集
- The Door Problem 並查集並查集
- 並查集練習並查集
- 簡單易懂的並查集演算法以及並查集實戰演練並查集演算法
- Soso 的並查集寫掛了並查集
- 並查集題目合集並查集
- 並查集java實現並查集Java
- 【轉】種類並查集並查集
- The Suspects-並查集(4)並查集
- 並查集擴充套件並查集套件
- (Day3)並查集並查集
- 並查集演算法並查集演算法