zoukankan      html  css  js  c++  java
  • D. Connected Components Croc Champ 2013

    292D - Connected Components

    D. Connected Components

    time limit per test

    2 seconds

    memory limit per test

    256 megabytes

    input

    standard input

    output

    standard output

    We already know of the large corporation where Polycarpus works as a system administrator. The computer network there consists of n computers and m cables that connect some pairs of computers. In other words, the computer network can be represented as some non-directed graph with n nodes and m edges. Let's index the computers with integers from 1 to n, let's index the cables with integers from 1 to m.

    Polycarpus was given an important task — check the reliability of his company's network. For that Polycarpus decided to carry out a series of k experiments on the computer network, where the i-th experiment goes as follows:

    1. Temporarily disconnect the cables with indexes from l**i to r**i, inclusive (the other cables remain connected).
    2. Count the number of connected components in the graph that is defining the computer network at that moment.
    3. Re-connect the disconnected cables with indexes from l**i to r**i (that is, restore the initial network).

    Help Polycarpus carry out all experiments and for each print the number of connected components in the graph that defines the computer network through the given experiment. Isolated vertex should be counted as single component.

    Input

    The first line contains two space-separated integers n, m (2 ≤ n ≤ 500; 1 ≤ m ≤ 104) — the number of computers and the number of cables, correspondingly.

    The following m lines contain the cables' description. The i-th line contains space-separated pair of integers x**i, y**i (1 ≤ x**i, y**i ≤ n; x**i ≠ y**i) — the numbers of the computers that are connected by the i-th cable. Note that a pair of computers can be connected by multiple cables.

    The next line contains integer k (1 ≤ k ≤ 2·104) — the number of experiments. Next k lines contain the experiments' descriptions. The i-th line contains space-separated integers l**i, r**i (1 ≤ l**i ≤ r**i ≤ m) — the numbers of the cables that Polycarpus disconnects during the i-th experiment.

    Output

    Print k numbers, the i-th number represents the number of connected components of the graph that defines the computer network during the i-th experiment.

    Examples

    input

    Copy

    6 51 25 42 33 13 661 32 51 55 52 43 3
    

    output

    Copy

    456342
    

    题意:

    给你一个含有n个点,m个边的无向图。

    以及q个询问

    每一个询问,给定一个l和r,代表在原本的图中,删除e[l]~e[r] 这些边,

    求剩下的图中联通快的个数。

    思路:

    我们建立2*m个并查集,

    前m个是从1到m个边依次加入时的图网络联通情况,用并查集数组a表示

    后m个维护反过来,即第m个到第1个边以此加入时的图网络联通情况。用并查集数组b来表示

    对于每一个询问:

    我们将a[l-1]和b[r+1]两个并查集合并,即可求得图中联通快的个数。

    时间复杂度为(O(n*m))

    代码:

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <cmath>
    #include <queue>
    #include <stack>
    #include <map>
    #include <set>
    #include <vector>
    #include <iomanip>
    #define ALL(x) (x).begin(), (x).end()
    #define sz(a) int(a.size())
    #define rep(i,x,n) for(int i=x;i<n;i++)
    #define repd(i,x,n) for(int i=x;i<=n;i++)
    #define pii pair<int,int>
    #define pll pair<long long ,long long>
    #define gbtb ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
    #define MS0(X) memset((X), 0, sizeof((X)))
    #define MSC0(X) memset((X), '', sizeof((X)))
    #define pb push_back
    #define mp make_pair
    #define fi first
    #define se second
    #define eps 1e-6
    #define gg(x) getInt(&x)
    #define chu(x) cout<<"["<<#x<<" "<<(x)<<"]"<<endl
    #define du3(a,b,c) scanf("%d %d %d",&(a),&(b),&(c))
    #define du2(a,b) scanf("%d %d",&(a),&(b))
    #define du1(a) scanf("%d",&(a));
    using namespace std;
    typedef long long ll;
    ll gcd(ll a, ll b) {return b ? gcd(b, a % b) : a;}
    ll lcm(ll a, ll b) {return a / gcd(a, b) * b;}
    ll powmod(ll a, ll b, ll MOD) {a %= MOD; if (a == 0ll) {return 0ll;} ll ans = 1; while (b) {if (b & 1) {ans = ans * a % MOD;} a = a * a % MOD; b >>= 1;} return ans;}
    void Pv(const vector<int> &V) {int Len = sz(V); for (int i = 0; i < Len; ++i) {printf("%d", V[i] ); if (i != Len - 1) {printf(" ");} else {printf("
    ");}}}
    void Pvl(const vector<ll> &V) {int Len = sz(V); for (int i = 0; i < Len; ++i) {printf("%lld", V[i] ); if (i != Len - 1) {printf(" ");} else {printf("
    ");}}}
    
    inline void getInt(int* p);
    const int maxn = 10010;
    const int inf = 0x3f3f3f3f;
    /*** TEMPLATE CODE * * STARTS HERE ***/
    int n, m;
    struct dsu
    {
        int fa[505];
        void init()
        {
            repd(i, 1, n)
            {
                fa[i] = i;
            }
        }
        int findpar(int x)
        {
            if (fa[x] == x)
            {
                return x;
            } else {
                return fa[x] = findpar(fa[x]);
            }
        }
        void mg(int a, int b)
        {
            a = findpar(a);
            b = findpar(b);
            if (a != b)
            {
                fa[a] = b;
            }
        }
        int getans()
        {
            int res = 0;
            repd(i, 1, n)
            {
                if (fa[i] == i)
                {
                    res++;
                }
            }
            return res;
        }
    } a[maxn], b[maxn];
    dsu t1, t2;
    pii c[maxn];
    int main()
    {
        //freopen("D:\code\text\input.txt","r",stdin);
        //freopen("D:\code\text\output.txt","w",stdout);
    
        while (~du2(n, m))
        {
            a[0].init();
            b[m + 1].init();
            t1.init();
            repd(i, 1, m)
            {
                du2(c[i].fi, c[i].se);
                t1.mg(c[i].fi, c[i].se);
                a[i] = t1;
            }
            t1.init();
            for (int i = m; i >= 1; --i)
            {
                t1.mg(c[i].fi, c[i].se);
                b[i] = t1;
            }
            int q;
            scanf("%d", &q);
            int l, r;
            while (q--)
            {
                du2(l, r);
                t2 = a[l - 1];
                repd(i, 1, n)
                {
                    // chu(t2.findpar(i));
                    // chu(b[r + 1].findpar(i));
                    t2.mg(t2.findpar(i), b[r + 1].findpar(i));
                }
                printf("%d
    ", t2.getans() );
            }
    
        }
    
        return 0;
    }
    
    inline void getInt(int* p) {
        char ch;
        do {
            ch = getchar();
        } while (ch == ' ' || ch == '
    ');
        if (ch == '-') {
            *p = -(getchar() - '0');
            while ((ch = getchar()) >= '0' && ch <= '9') {
                *p = *p * 10 - ch + '0';
            }
        }
        else {
            *p = ch - '0';
            while ((ch = getchar()) >= '0' && ch <= '9') {
                *p = *p * 10 + ch - '0';
            }
        }
    }
    
    
    
    
    
    本博客为本人原创,如需转载,请必须声明博客的源地址。 本人博客地址为:www.cnblogs.com/qieqiemin/ 希望所写的文章对您有帮助。
  • 相关阅读:
    Lodop简短问答客户反馈篇 及排查步骤 及注册相关
    Win10图片打不开文件系统错误2147416359解决方法
    Lodop中特殊符号¥打印设计和预览不同
    LODOP安装参数 及静默安装
    LODOP打印安装到win的特殊字体
    Lodop打印设计(PRINT_DESIGN)介绍
    Lodop打印设计里的 打印项对齐
    System.out.println与System.err.println的区别(输出顺序!!!)
    享元模式
    Java中关于HashMap的元素遍历的顺序问题
  • 原文地址:https://www.cnblogs.com/qieqiemin/p/11762586.html
Copyright © 2011-2022 走看看