並查集的應用: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;
}
相關文章
- HDU 1213 How Many Tables(並查集)並查集
- 並查集的應用並查集
- 並查集應用並查集
- 並查集—應用並查集
- 並查集的應用2並查集
- 並查集深度應用並查集
- 並查集以及應用並查集
- 並查集(二)並查集的演算法應用案例上並查集演算法
- 並查集的簡單應用並查集
- 並查集的分析及應用並查集
- 並查集應用總結並查集
- 社交網路 (並查集的應用)並查集
- 並查集詳解與應用並查集
- HDU-1272 小希的迷宮 並查集並查集
- hdu 1829 並查集(食物鏈的弱化版)並查集
- 食物鏈(並查集的簡單應用)並查集
- HDU-3172 Virtual Friends 並查集+map並查集
- hdu5222 拓撲+並查集並查集
- hdu 1811 並查集+拓撲排序並查集排序
- 並查集經典應用場景並查集
- HDU 1272小希的迷宮(簡單並查集)並查集
- 並查集的初級應用及進階並查集
- HDU 1198Farm Irrigation(並查集)並查集
- HDU 5200 Tree (離線並查集)並查集
- HDU 3234 Exclusive-OR 擴充套件並查集套件並查集
- 並查集(Union-Find) 應用舉例並查集
- 【帶權並查集】理論和應用並查集
- 並查集 (Union-Find Sets)及其應用並查集
- 並查集在實際問題中的應用並查集
- 資料結構 — 並查集的原理與應用資料結構並查集
- hdu4313 貪心並查集 || 樹形dp並查集
- HDU 3038 How Many Answers Are Wrong (帶權並查集)並查集
- HDU-3635 Dragon Balls 並查集路徑壓縮Go並查集路徑壓縮
- HDU-3461 Code Lock 並查集 + 二分求冪並查集
- 並查集到帶權並查集並查集
- 並查集(一)並查集的幾種實現並查集
- 【演算法】並查集的運用演算法並查集
- HDU 3938 Portal【並查集+upper_bound(第四個引數)】並查集