• HDU1213 How Many Tables


    问题链接:HDU1213 How Many Tables

    问题简述:测试用例有T组。输入n和m,分别表示总人数和朋友对的数量。再输入m个数对s和d表示s和d是朋友。朋友以及间接朋友坐在同一张桌子上。计算需要几张桌子?

    问题分析:这是一个有关图的连通性问题,可以用并查集来解决。并查集中,连通的各个结点都会指向相同的根。

    程序说明:程序中,构建一个用并查集,使得相互连通的子图指向相同的根,最后数一下有几个相互连通的子图就可以了。

    AC的C++语言程序如下:

    /* HDU1213 How Many Tables */
    
    #include <iostream>
    #include <vector>
    
    using namespace std;
    
    // 并查集类
    class UF {
    private:
        vector<int> v;
    public:
        UF(int n) {
            for(int i=0; i<=n; i++)
                v.push_back(i);
        }
    
        int Find(int x) {
            for(;;) {
                if(v[x] != x)
                    x = v[x];
                else
                    return x;
            }
        }
    
        bool Union(int x, int y) {
            x = Find(x);
            y = Find(y);
            if(x == y)
                return false;
            else {
                v[x] = y;
                return true;
            }
        }
    };
    
    int main()
    {
        int t, n, m, src, dest, count;
    
        // 输入测试用例数量
        cin >> t;
        while(t--) {
            cin >> n >> m;
    
            UF uf(n);
    
            // 输入m个朋友关系,构建并查集
            while(m--) {
                cin >> src >> dest;
    
                if(uf.Find(src) != uf.Find(dest))
                    uf.Union(src, dest);
            }
    
            // 计算需要桌子的数量:即相互联通子图的数量
            count = 0;
            for(int i=1; i<=n; i++)
                if(uf.Find(i) == i)
                    count++;
    
            // 输出结果
            cout << count << endl;
        }
    
        return 0;
    }


  • 相关阅读:
    每种特定的迭代器如何使用
    常量迭代器
    容器迭代器
    三十分钟掌握STL
    高快省的排序算法
    FloatTest32 Example
    /浮点数的比较
    java第一天
    ACwing 898
    POJ 3268
  • 原文地址:https://www.cnblogs.com/tigerisland/p/7564119.html
Copyright © 2020-2023  润新知