并查集 POJ 2236
关于并查集,每个节点记录的仅仅是自身与其祖先之间的关系,有时候可能没有得到及时的更新,但是一旦调用find函数,得到的就是当前最新的祖先,同一祖先下的孩子是在同一集合下的;
如果需要对该集合进行分类,可以对每个元素进行做标记 如:POJ 1703(这题主要是将集合分成两类 )
POJ 关于并查集的题: 2492 、2524 、1703 、1733 、1182等等
#include<iostream>
using namespace std;
#define MAXN 1010
int x[MAXN],y[MAXN],parent[MAXN];
bool v[MAXN];
int find(int x)
{
if(x!=parent[x]) parent[x]=find(parent[x]);
return parent[x];
}
bool dis(int a,int b,int d)
{
return ((x[a]-x[b])*(x[a]-x[b])+(y[a]-y[b])*(y[a]-y[b])<=d*d);
}
int main()
{
int n,d,a,b;
char ch;
cin>>n>>d;
for(int i=1;i<=n;i++)
{
cin>>x[i]>>y[i];
parent[i]=i;
v[i]=false;
}
while(cin>>ch)
{
if(ch=='O')
{
cin>>a;
v[a]=true;
for(int i=1;i<=n;i++)
{
if((i!=a)&&v[i]&&dis(i,a,d))
{
int c=find(i);
int k=find(a);
parent[c]=k;
}
}
}
else
{
cin>>a>>b;
if(find(a)==find(b)) cout<<"SUCCESS"<<endl;
else cout<<"FAIL"<<endl;
}
}
return 0;
}
浙公网安备 33010602011771号