码迷,mamicode.com
首页 > 其他好文 > 详细

luogu1196 银河英雄传说 (并查集)

时间:2018-11-01 11:34:04      阅读:171      评论:0      收藏:0      [点我收藏+]

标签:lse   inline   return   style   while   set   std   i++   c++   

并查集,不仅记fa,还记与fa的距离,还记根对应的尾节点

路径压缩的时候更新那个距离就行了

 1 #include<bits/stdc++.h>
 2 #define pa pair<int,int>
 3 #define CLR(a,x) memset(a,x,sizeof(a))
 4 using namespace std;
 5 typedef long long ll;
 6 const int maxn=3e4+10;
 7 
 8 inline ll rd(){
 9     ll x=0;char c=getchar();int neg=1;
10     while(c<0||c>9){if(c==-) neg=-1;c=getchar();}
11     while(c>=0&&c<=9) x=x*10+c-0,c=getchar();
12     return x*neg;
13 }
14 
15 int fa[maxn],tl[maxn],dis[maxn],T,N=30000;
16 
17 inline int getf(int x){
18     if(x==fa[x]) return x;
19     int re=getf(fa[x]);
20     dis[x]+=dis[fa[x]],fa[x]=re;
21     return re;
22 }
23 
24 inline void add(int x,int y){
25     int a=getf(x),b=getf(y);
26     fa[a]=tl[b],tl[b]=tl[a],dis[a]=1;
27 }
28 
29 int main(){
30     // freopen("testdata.in","r",stdin);
31     int i,j,k;
32     T=rd();
33     for(i=1;i<=N;i++)
34         tl[i]=fa[i]=i;
35     for(i=1;i<=T;i++){
36         char s[5];scanf("%s",s);
37         int a=rd(),b=rd();
38         if(s[0]==M) add(a,b);
39         else{
40             int x=getf(a),y=getf(b);
41             if(x!=y) printf("-1\n");
42             else printf("%d\n",abs(dis[a]-dis[b])-1);
43         }
44     }
45     return 0;
46 }

 

luogu1196 银河英雄传说 (并查集)

标签:lse   inline   return   style   while   set   std   i++   c++   

原文地址:https://www.cnblogs.com/Ressed/p/9887250.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!