poj2236

来源:互联网 发布:mysql设置字符集为utf8 编辑:程序博客网 时间:2024/05/16 08:41

本题就是简单的并查集,没有什么东西,连rank数组都不要,一开始忘了写init函数了,也就是说没初始化,单步了一次然后就过了,以后init函数在主函数写了,每次都忘。想让程序写得有层次点就出问题,bs一下自己。

#include<iostream>
using namespace std;

int f[1010],a[1010][2],used[1010];
int n,d;

void init()
{
 for(int i=1;i<=n;i++)
 {
  f[i]=i;
 }
}

int Find(int x)
{
 if(x==f[x])
  return x;
 f[x]=Find(f[x]);
 return f[x];
}

void Union(int x,int y)
{
 int a=Find(x);
 int b=Find(y);
 if(a==b)
  return;
 else
 {
  f[a]=b;
 }
}

void insert(int x)
{
 int i;
 for(i=1;i<=n;i++)
 {
  if(i!=x&&used[i])
  {
   if((a[i][0]-a[x][0])*(a[i][0]-a[x][0])+(a[i][1]-a[x][1])*(a[i][1]-a[x][1])<=d*d)
    Union(i,x);
  }
 }
}

int judge(int x,int y)
{
 if(Find(x)==Find(y))
  return 1;
 else
  return 0;

}

int main()
{
 int i,j,x,y;
 char ch;
 scanf("%d%d",&n,&d);
 for(i=1;i<=n;i++)
 {
  scanf("%d%d",&a[i][0],&a[i][1]);
 }
 init();
 while(1)
 {
  getchar();
  if(scanf("%c",&ch)==EOF)
   break;
  switch(ch)
  {
  case 'O':
   scanf("%d",&j);
   used[j]=1;
   insert(j);
   break;
  case 'S':
   scanf("%d%d",&x,&y);
   if(judge(x,y))
    printf("SUCCESS/n");
   else
    printf("FAIL/n");
   break;
  }
 }
 return 0;
}

原创粉丝点击