把两个舰队合并起来,查询某两个舰是否在同一舰队中,简单用一下并查集就可以了。
但本题不限于此,还需要求两个舰的距离,那么试试改并查集,并查集最大的特点就是利用祖先,那么他们的距离就可以用到祖先的距离差表示。
现在的问题是求某点到其祖先的距离,一定不能取消路径压缩计算次数,铁定超时。
开一个数组front[i]表示i点到祖先的距离,典型的加权并查集,在路径压缩时进行修改(详见代码)。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<iomanip>
#include<algorithm>
using namespace std;
int n;int father[30001],front[30001],hou[30001];
int find(int x)