zoukankan      html  css  js  c++  java
  • P1196 [NOI2002]银河英雄传说 并查集

    并查集好题,维护两个值,一个是所处队列大小,一个是每个结点队列前面还有几个数。

    第二个维护需要巧妙的搞一搞,见find函数

    #include <bits/stdc++.h>
    using namespace std;
    #define ll long long
    #define forn(i,n) for(int i=0;i<n;++i)
    #define for1(i,n) for(int i=1;i<=n;++i)
    #define IO ios::sync_with_stdio(false);cin.tie(0)
    const int maxn = 3e4+5;
    
    int par[maxn],sz[maxn],front[maxn];
    
    void init(){
        forn(i,maxn) par[i] = i,sz[i] = 1,front[i] = 0; 
    }
    int find(int x){
        if(par[x] == x) return x;
        int fx = find(par[x]);
        front[x] += front[par[x]];
        return par[x] = fx;
    }
    int main(){ 
        IO;init();
        int t;cin>>t;while(t--){
            char op;int x,y;cin>>op>>x>>y;
            int fx = find(x),fy = find(y);
            if(op=='M'){
                front[fx] += sz[fy];
                sz[fy] += sz[fx];
                par[fx] = fy;
            }else{
                if(fx!=fy) cout<<-1<<'
    ';
                else cout<<abs(front[x]-front[y])-1<<'
    ';
            }   
        }
        return 0;
    }
  • 相关阅读:
    Celery
    MongoDB-简介
    人工智障
    Flask-session,WTForms,POOL,Websocket通讯原理 -握手,加密解密过程
    web-socket
    flask基础2
    flask的基础1
    项目部署
    nginx简单学习
    redis的安装与配置
  • 原文地址:https://www.cnblogs.com/AlexPanda/p/12520278.html
Copyright © 2011-2022 走看看