zoukankan      html  css  js  c++  java
  • City Road

    题目描述

    从前有一个叫做”H湖”的地方,”H湖”的居民生活在不同的小岛上,当他们想去其他的小岛时都要通过划小船或者小岛之间的桥来实现.现在政府想实现”H湖”的全畅通!(不一定有直接的桥相连,只要互相间接通过桥可达即可).”H湖”已经造出了一些桥出来连接某两个岛.问最少还需要建设几座桥?

    解答要求时间限制:2000ms, 内存限制:64MB
    输入

    每个输入文件包含一组数据,每组数据首先是两个整数N(1 <= N <= 1000)和M(1 <= M <= 100000),代表小岛的个数以及已经建设好的桥数目,接下来M行对应M座桥,每行给定一对正整数,分别是该座桥连通的两个岛的编号.为简单起见,岛从1到N编号.
    注意:两个岛之间可以有多座桥相通,也就是说
    3 3
    1 2
    1 2
    2 1
    这种输入也是合法的

    输出

    每组输入数据输出一行,代表最少还需要建设的桥的数目.

    样例

    输入样例 1

    5 2
    1 2
    3 5

    输出样例 1

    2 

    提示

    并查集,做完了之后输出不相交集的个数减一.

    //
    // Created by l50007414 on 2019/9/19.
    //
    
    #include <stdio.h>
    
    int find(int x);
    
    void join(int x, int y);
    
    int father[1001];
    int res;
    
    int main() {
        int n, m;
        scanf("%d %d", &n, &m);
        res = n - 1;
        for (int j = 1; j <= n; ++j) {
            father[j] = j;
        }
        for (int i = 0; i < m; ++i) {
            int x, y;
            scanf("%d %d", &x, &y);
            join(x, y);
        }
        printf("%d",res);
    }
    
    int find(int x) {
        int r = x;
        while (father[r] != r) {
            r = father[r];
        }
        return r;
    }
    
    void join(int x, int y) {
        int fx = find(x), fy = find(y);
        if (fx != fy) {
            father[fx] = fy;
            res--;
        }
    }

    并查集详解 ——图文解说,简单易懂

  • 相关阅读:
    CodeForces 1017B
    POJ 1323-Game Prediction(贪心)
    CodeForces 104B-Testing Pants for Sadness(思维题)
    CodeForces 1324D
    UVA 1152-4 Values whose Sum is 0(二分查找)
    POJ 1700-Crossing River(贪心)
    HDU 1789-Doing Homework again(并查集+贪心)
    SDUT 1298-活动选择(贪心)
    HDU 1272-小希的迷宫(带环并查集)
    CodeForces
  • 原文地址:https://www.cnblogs.com/ustc-anmin/p/11549863.html
Copyright © 2011-2022 走看看