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

猜你喜欢

转载自blog.csdn.net/hdq1745/article/details/126812648