题目描述
解题思路
这是带边权的并查集。用并查集维护战舰是否在同一列,以每一列的第一艘战舰作为集合代表,用一个dis数组记录边权。
Code
#include <iostream> #include <cstdio> #include <cmath> using namespace std; int n, x, y, xx, yy, fa[50010], num[50010], dis[50010]; char c; int find(int x) { if(fa[x]==x) return x; int cnt=find(fa[x]); dis[x]=dis[fa[x]]+dis[x]; fa[x]=cnt; return fa[x]; } int main() { for(int i=1;i<=50000;i++) fa[i]=i,num[i]=1; scanf("%d",&n); for(int i=1;i<=n;i++) { cin>>c; scanf("%d %d",&x,&y); xx=find(x),yy=find(y); if (c== 'M') { fa[xx]=yy; dis[xx]=num[yy]; num[yy]+=num[xx],num[xx]=0; } else { if(xx!=yy) printf("-1\n"); else printf("%d\n",abs(dis[x]-dis[y])-1); } } }
谢谢阅读
作者:基德不基,转载请注明原文链接