zoukankan      html  css  js  c++  java
  • 洛谷P1192 银河英雄传说题解

       本题是带权并查集的简单题,考虑3点

        1.合并用普通并查集。

         2.维护d数组表示两者之间的舰队数量

       3.维护size数组表示舰队的大小

         

    #include<iostream>
    #include<cstring>
    #include<string>
    #include<cmath>
    #include<algorithm>
    #include<map>
    #include<vector>
    #include<cstdio>
    #include <unordered_map>
    using namespace std;
    const int N=2000005;
    const int inf=0x3f3f3f3f;
    typedef long long ll;
    unordered_map<int,int> s;
    int cnt;
    int p[N];
    int size[N];
    int d[N];
    int find(int x){
        if(x!=p[x]){
            int root=find(p[x]);
            d[x]+=d[p[x]];
            p[x]=root;
        }
        return p[x];
    }
    int main(){
        int t;
        cin>>t;
        int i,n;
        for(i=1;i<=30001;i++){
            p[i]=i;
            size[i]=1;
        }
        while(t--){
            string s;
            int x,y,i,j;
            cin>>s>>x>>y;
            if(s=="M"){
                int pa=find(x),pb=find(y);
                d[pa]=size[pb];
                size[pb]+=size[pa];
                p[pa]=pb;    
            }
            else{
                int pa=find(x),pb=find(y);
                if(pa!=pb){
                    cout<<-1<<endl;
                }
                else{
                    cout<<max(0,abs(d[x]-d[y])-1)<<endl;
                }    
                
            }
        }
    }
    View Code
  • 相关阅读:
    maven项目诡异的问题
    13) Developing Java Plugins
    15) maven dependency scope
    Bootstrap学习记录
    电力
    MongoDB学习记录
    Java基础知识
    旅游
    人生感悟
    【转】25岁到55岁:如何规划人生最重要的三个十年
  • 原文地址:https://www.cnblogs.com/ctyakwf/p/12187404.html
Copyright © 2011-2022 走看看