银河英雄传说

think twice,code once

这道题一开始没想清楚,g[i]表示的是i前面的点,不包括i,

对回溯理解不清,回溯就是递归回来到这里了,再处理一些事......

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cmath>
 4 using namespace std;
 5 const int maxn=30007;
 6 int fa[maxn],sz[maxn],g[maxn];
 7 int find(int x){
 8     if(fa[x]==x) return x;
 9     else{
10         int tt=find(fa[x]);
11         g[x]+=g[fa[x]];
12         return fa[x]=tt;
13     }
14 }
15 void merge(int x,int y){
16     int fx=find(x);int fy=find(y);
17     if(fx==fy) return;
18     g[fx]+=sz[fy];fa[fx]=fy;sz[fy]+=sz[fx];sz[fx]=0;
19 }
20 int main(){
21     for(int i=1;i<=maxn;i++){g[i]=0;sz[i]=1;fa[i]=i;}
22     int t;cin>>t;
23     while(t--){
24         char a;cin>>a;
25         int x,y;cin>>x>>y;
26         if(a=='M'){
27             merge(x,y);
28         }
29         if(a=='C'){
30             int fx=find(x);int fy=find(y);
31             if(fx!=fy) cout<<-1<<endl;
32             else cout<<abs(g[x]-g[y])-1<<endl;
33         }
34     }
35     return 0;
36 }

 

posted @ 2018-09-02 21:34  lcan  阅读(217)  评论(0编辑  收藏  举报