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() 返回键值>给定元素的第一个位置