• HDU Problem 2120 Ice_cream's world I 【并查集检查环】


    Ice_cream's world I

    Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 1193    Accepted Submission(s): 716

    Problem Description
    ice_cream's world is a rich country, it has many fertile lands. Today, the queen of ice_cream wants award land to diligent ACMers. So there are some watchtowers are set up, and wall between watchtowers be build, in order to partition the ice_cream’s world. But how many ACMers at most can be awarded by the queen is a big problem. One wall-surrounded land must be given to only one ACMer and no walls are crossed, if you can help the queen solve this problem, you will be get a land.
     
    Input
    In the case, first two integers N, M (N<=1000, M<=10000) is represent the number of watchtower and the number of wall. The watchtower numbered from 0 to N-1. Next following M lines, every line contain two integers A, B mean between A and B has a wall(A and B are distinct). Terminate by end of file.
     
    Output
    Output the maximum number of ACMers who will be awarded.
    One answer one line.
     
    Sample Input
    8 10 0 1 1 2 1 3 2 4 3 4 0 5 5 6 6 7 3 6 4 7
     
    Sample Output
    3
     
    Author
    Wiskey
     
    Source
     
    Recommend
    威士忌   |   We have carefully selected several similar problems for you:  2122 2118 2119 2121 2117 
     题意:有m个围墙连接n个哨岗,求由围墙包围得有多少个环。
    思路:利用并查集,当两个哨岗的父节点相同时必定成一个环,检查共有多少个环。
    #include <bitsstdc++.h>
    #define MAX_N 1005
    using namespace std;
    const int INF = 1e9;
    
    int par[MAX_N], m, n, ans;
    void init() {
        for (int i = 0; i < 1002; i++) {
            par[i] = i;
        }
    }
    int Find(int x) {
        if (x == par[x]) return x;
        return par[x] = Find(par[x]);
    }
    void unite(int x, int y) {
        int fx = Find(x);
        int fy = Find(y);
        if (fx == fy) ans++;
        else par[fy] = fx;
    }
    int main() {
        int a, b;
        while (scanf("%d%d", &n, &m) != EOF) {
            init(); ans = 0;
            for (int i = 0; i < m; i++) {
                scanf("%d%d", &a, &b);
                unite(a, b);
            }
            printf("%d
    ", ans);
        }
        return 0;
    }

  • 相关阅读:
    vim配置----YouCompleteMe配置
    Linux之configure make make install
    zookeeper原理与实践(一)----zookeeper的基本功能
    RPC原理与实践(二)----Thrift分层模型
    RPC原理与实践(一)----RPC原理与实现(Thrift版)
    mysql由浅入深探究(四)----mysql事务详解
    mysql由浅入深探究(三)----mysql增删改查
    mysql由浅入深探究(二)----mysql用户操作
    Django
    7.1
  • 原文地址:https://www.cnblogs.com/cniwoq/p/6770880.html
Copyright © 2020-2023  润新知