zoukankan      html  css  js  c++  java
  • P1536 村村通 【并查集求连通块个数】

    题目

    https://www.luogu.com.cn/problem/P1536

     这道题第一眼的思路感觉是最小生成树,但是发现它的边没有权值,所以这道题的问题是求解这个图的连通块的个数,而需要连接的道路条数就是连通块的个数减一

    代码

    #include<iostream>
    #include<cstdio>
    #include<string>
    #include<cstring>
    using namespace std;
    int father[6000], ranks[6000];
    int find(int x)
    {
        if (father[x] == x)return x;
        return father[x] = find(father[x]);
    }
    void merge(int x, int y)
    {
        int a = find(x);
        int b = find(y);
        if (a == b)return;
        if (ranks[a] > ranks[b])father[b] = a;
        else
        {
            father[a] = b;
            if (ranks[a] == ranks[b])ranks[b]++;
        }
    }
    
    int main()
    {
        int n, m;
        while (1)
        {
            cin >> n;
            if (n == 0)return 0;
            cin >> m;
            for (int i = 1; i <= n; i++)father[i] = i;
            for (int i = 0; i < m; i++)
            {
                int a, b;
                scanf("%d%d", &a, &b);
                merge(a, b);
            }
            int count = 0;
            for (int i = 1; i <=n; i++)
            {
                if (father[i] == i)count++;
            }
            printf("%d
    ", count-1);
        }
    
    }
  • 相关阅读:
    汉语编程
    第一次作业
    个人总结
    psp表格
    第三次个人作业——用例图设计
    第二次结对作业
    第一次结对作业
    第二次个人编程作业
    第一次编程作业
    第一次博客作业
  • 原文地址:https://www.cnblogs.com/Jason66661010/p/13205022.html
Copyright © 2011-2022 走看看