带权并查集--POJ 1988-Cube Stacking

    xiaoxiao2025-07-24  4

    题意:

    规定若干个坐标,xi ,yi 

    查询是否从一个点到另一个点可以连通(即距离小于d)

    思路:

    依次查找两点间距离,如果可以就合并到同一个集合中

    #include <iostream> #include <stdio.h> using namespace std; int father[1005]; int xi[1005]; int yi[1005]; int d,n; int find(int x) { if(father[x]!=x) father[x]=find(father[x]); return father[x]; } void Union(int x) { for(int i=1;i<=n;i++) { int root1=find(x);//一定要合在里面,否则 O 4 O 3会出错。父节点没更新 if(father[i]!=0&&i!=x) { int tep=(xi[x]-xi[i])*(xi[x]-xi[i])+(yi[x]-yi[i])*(yi[x]-yi[i]); if(tep<=d*d) { int root2=find(i); father[root1]=root2; } } } } int main() { cin>>n>>d; for(int i=1;i<=n;i++) father[i]=0; for(int i=1;i<=n;i++) { cin>>xi[i]>>yi[i]; } char s[5]; while(~scanf("%s",s)) { int x,y; if(s[0]=='O') { scanf("%d",&x); father[x]=x; Union(x); find(x); } else { scanf("%d%d",&x,&y); find(x); find(y); if(father[x]==father[y]) printf("SUCCESS\n"); else printf("FAIL\n"); } } return 0; }
    转载请注明原文地址: https://ju.6miu.com/read-1301001.html
    最新回复(0)