• poj 1988 Cube Stacking && codevs 1540 银河英雄传说(加权并茶几)


    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #define maxn 30010
    using namespace std;
    int m,fa[maxn],top[maxn],num[maxn];
    char s;
    int find(int x)
    {
        if(x==fa[x])return x;
        int f=fa[x];
        fa[x]=find(fa[x]);
        num[x]=num[x]+num[f];
        return fa[x];
    }
    void merge(int a,int b)
    {
        int r1=find(a);
        int r2=find(b);
        fa[r1]=r2;
        find(top[r2]);
        num[r1]=num[top[r2]]+1;
        top[r2]=top[r1];
    }
    int main()
    {
        scanf("%d",&m);
        int x,y;
        for(int i=1;i<=30000;i++)
          fa[i]=top[i]=i;
        for(int i=1;i<=m;i++)
          {
              cin>>s;
              if(s=='M')
                {
                    scanf("%d%d",&x,&y);
                    if(find(x)==find(y))continue;
                    merge(x,y);
              }
            if(s=='C')
              {
                  scanf("%d",&x);
                int tmp=find(x);
                printf("%d
    ",num[x]);
              }
          }
        return 0;
    }
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #define maxn 30010
    using namespace std;
    int m,fa[maxn],top[maxn],num[maxn];
    char s;
    int find(int x)
    {
        if(x==fa[x])return x;
        int f=fa[x];
        fa[x]=find(fa[x]);
        num[x]=num[x]+num[f];
        return fa[x];
    }
    void merge(int a,int b)
    {
        int r1=find(a);
        int r2=find(b);
        fa[r1]=r2;
        find(top[r2]);
        num[r1]=num[top[r2]]+1;
        top[r2]=top[r1];
    }
    int main()
    {
        //freopen("no.txt","w",stdout);
        scanf("%d",&m);
        int x,y;
        for(int i=1;i<=30000;i++)
          fa[i]=top[i]=i;
        for(int i=1;i<=m;i++)
          {
              cin>>s;
              if(s=='M')
                {
                    scanf("%d%d",&x,&y);
                    if(find(x)==find(y))continue;
                    merge(x,y);
              }
            if(s=='C')
              {
                  scanf("%d%d",&x,&y);
                int r1=find(x);
                int r2=find(y);
                if(r1!=r2)printf("-1
    ");
                else printf("%d
    ",max(num[x],num[y])-min(num[x],num[y])-1);
              }
          }
        return 0;
    }
  • 相关阅读:
    购物英语词汇
    生活学习英语词汇
    银行英语词汇
    烹饪英语词汇
    旅游英语词汇
    饮食英语词汇
    书英语词汇
    王元编辑口语资料中国传统之节日
    DataSet在WCF中怎么办?
    Python生成Wav格式文件
  • 原文地址:https://www.cnblogs.com/yanlifneg/p/5708909.html
Copyright © 2020-2023  润新知