[NOI2002]银河英雄传说思路

 emm并没有什么好说的.毕竟我这个蒟蒻都能yy出来

 1 #include<cstring>
 2 #include<cstdio>
 3 #include<iostream>
 4 #include<cmath>
 5 using namespace std;
 6 int t,fa[30010],dis[30010],num[30010];
 7 //dis距离num数量
 8 char s;
 9 int find(int n)
10 {
11     if(fa[n]==n)return n;
12     int father=fa[n];
13     fa[n]=find(fa[n]);
14     dis[n]+=dis[father];
15     num[n]=num[fa[n]];
16 //更新一下
17     return fa[n];
18 }
19 void he(int a,int b)//合并所以合并的英文貌似是merge
20 {
21     int f1=find(a),f2=find(b);
22     if(f1!=f2){
23         fa[f1]=f2;
24         dis[f1]=dis[f2]+num[f2];
25         num[f1]+=num[f2];
26         num[f2]=num[f1];
27     }
28 }
29 
30 int query(int a,int b)//查询
31 {
32     int f1=find(a),f2=find(b);
33     if(f1==f2){
34         return abs(dis[a]-dis[b]);
35     }
36     return 0;
37 }
38 
39 int main()
40 {
41     int i,j;
42     scanf("%d",&t);
43     for(i=1;i<=30000;i++)
44     {
45         fa[i]=i;dis[i]=0;num[i]=1;
46     }
47     for(i=1;i<=t;i++)
48     {
49         cin>>s;
50         int a,b;
51         scanf("%d%d",&a,&b);
52         if(s=='M')he(a,b);
53         else printf("%d\n",query(a,b)-1);
54     } 
55 return 0;
56 }

没啦

猜你喜欢

转载自www.cnblogs.com/pile8852/p/9278183.html