zoukankan      html  css  js  c++  java
  • 并查集+几何——pku2236

    把点与点的关系保存在连接矩阵里就好了,如果距离小于等于规定距离的话就赋值为1
    然后不断做(做符合条件)合并操作即可……
    View Code
    #include<stdio.h>

    #define N 1005
    int f[N];
    int d;
    int ji[N];

    struct data
    {
    int x,y;
    }p[N];

    bool map[N][N];

    int dis(data a,data b)
    {
    int temp=(a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y);
    if(temp<=(d*d))
    return 1;
    return 0;
    }

    int find(int pos)
    {
    if(f[pos]==-1)return pos;
    return pos=find(f[pos]);
    }

    int un(int x,int y)
    {
    int a=find(x);
    int b=find(y);
    if(a==b)return 0;
    f[a]
    =b;
    return 1;
    }

    int main()
    {
    int n;
    scanf(
    "%d%d",&n,&d);
    int i,j;
    for(i=1;i<=n;i++)
    {
    f[i]
    =-1;
    scanf(
    "%d%d",&p[i].x,&p[i].y);
    }

    for(i=1;i<=n;i++)
    {
    for(j=i;j<=n;j++)
    {
    if(i==j)
    {
    map[i][i]
    =0;
    continue;
    }
    map[i][j]
    =dis(p[i],p[j]);
    map[j][i]
    =map[i][j];
    }
    }
    getchar();
    char rt;
    int add=0,temp,a,b;
    while(scanf("%c",&rt)!=EOF)
    {
    if(rt=='O')
    {
    scanf(
    "%d",&temp);
    for(i=1;i<=add;i++)
    {
    if(map[ji[i]][temp]==1)
    un(ji[i],temp);
    }
    add
    ++;
    ji[add]
    =temp;
    }
    else if(rt=='S')
    {
    scanf(
    "%d%d",&a,&b);
    if(find(a)==find(b))
    printf(
    "SUCCESS\n");
    else
    printf(
    "FAIL\n");
    }
    //getchar();
    }


    }
  • 相关阅读:
    图论——拓扑排序
    BZOJ 2882 & 后缀数组的傻逼实现
    BZOJ 2626 & KDtree
    Colorado Potato Beetle(CF的某道) & 鬼畜宽搜
    Prime & 反素数plus
    BZOJ 2049 & LCT又一模板
    BZOJ2002 & LCT模板(分块不会搞)
    BZOJ2190 & 欧拉函数
    BZOJ 1053 & 反素数
    POJ2774 & 后缀数组模板题
  • 原文地址:https://www.cnblogs.com/huhuuu/p/1966412.html
Copyright © 2011-2022 走看看