动规(22)-并查集基础题——CD收藏 cd.cpp(并查集)
Posted H_Cisco
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了动规(22)-并查集基础题——CD收藏 cd.cpp(并查集)相关的知识,希望对你有一定的参考价值。
Description
约翰平常爱听歌,所以买了很多的CD来收藏,但是因为平常整理不当,所以忘记了这些CD的歌手是谁。现在他想知道他到底收藏了多少位歌手的专辑,于是他想了一个办法,同时拿出两个CD来听,可以分辨出来是否为同一个歌手唱的。(如果没有说明则认为是没有分辨出来,为不同歌手)现在他列了一个表记录哪些专辑是同一歌手,但他面对着这一堆记录不知如何处理,请你告诉他到底他有多少个歌手的专辑。
Input
第一行n,m。n表示CD的个数(标号分别为1到n),m表示约翰所分辨出来的共有几组。接下来的m行每一行有两个数a,b。表示a唱片和b唱片是同一个歌手。(1<=n,m<=10000)
Output
总计的歌手数量。
Sample Input
10 9
1 2
3 4
5 2
4 6
2 6
8 7
9 7
1 6
2 4
Sample Output
3
#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
int n, m, x, y;
int f[10005];
int find(int v)
return f[v] == v ? v : f[v] = find(f[v]);
int merg(int v, int u)
int t1, t2;
t1 = find(v);
t2 = find(u);
f[t2] = t1;
return 0;
int main()
freopen("cd.in", "r", stdin);
freopen("cd.out", "w", stdout);
scanf("%d%d", &n, &m);
int sum = 0;
memset(f, 0, sizeof(f));
for (int i = 1; i <= n; i++)
f[i] = i;
for (int i = 1; i <= m; i++)
scanf("%d%d", &x, &y);
merg(x, y);
for (int i = 1; i <= n; i++)
if (f[i] == i)
sum++;
printf("%d\\n", sum);
return 0;
map的基本知识普及:
C++ Maps是一种关联式容器,包含“关键字/值”对
begin() 返回指向map头部的迭代器
clear() 删除所有元素
count() 返回指定元素出现的次数
empty() 如果map为空则返回true
end() 返回指向map末尾的迭代器
erase() 删除迭代器所指一个元素
find() 查找一个元素
insert() 插入元素
size() 返回map中元素的个数
swap() 交换两个map
upper_bound() 返回键值>给定元素的第一个位置
以上是关于动规(22)-并查集基础题——CD收藏 cd.cpp(并查集)的主要内容,如果未能解决你的问题,请参考以下文章
动规(22)-并查集基础题——CD收藏 cd.cpp(并查集)