您的位置:首页 > 其它

poj 2236 Wireless Network (并查集)

2011-01-05 17:56 429 查看
弄了一下午,终于把这个也弄AC了。

刚开始想修好一个后和已知的循环求距离然后合并,一想担心时间肯定不够,然后又看了网上的阶梯报告,结果就是这样,悲哀呀 (ˇˍˇ) 回头一看题目时间是10000MS。。。

#include "iostream"
#include "stdio.h"
#include "cmath"
using namespace std;

struct point
{
unsigned int x,y;
int set;
}r[1003];

int make(int n)
{
int i;
for(i=0; i<=n; i++)
r[i].set=i;
}

int find(int x)
{
if(x!=r[x].set)
r[x].set=find(r[x].set);
return r[x].set;
}

int Union(int rx,int ry)
{
if(rx==ry)  return 0;
r[ry].set=rx;
}

int main()
{
int i,j,x,y,e,oc,m,d,n;
int a,b,rx,ry;
double dis;
int hasre[1003];
char c;
scanf("%d%d",&n,&d);
make(n);
for(e=1; e<=n; e++)
scanf("%d%d",&r[e].x,&r[e].y);
oc=1;
while(scanf("/n%c %d",&c,&a)!=EOF)
{
if(c=='O')
{
hasre[oc++]=a;

for(j=1; j<oc; j++)
{
dis=(r[hasre[j]].x-r[a].x)*(r[hasre[j]].x-r[a].x)+
(r[hasre[j]].y-r[a].y)*(r[hasre[j]].y-r[a].y);
//            cout<<"dis="<<dis<<endl;
if(dis<=d*d)
{
rx=find(a);
ry=find(hasre[j]);
Union(rx,ry);
}
}
}
else
{
scanf("%d",&b);
rx=find(a);
ry=find(b);
if(rx==ry)
printf("SUCCESS/n");
else
printf("FAIL/n");
}
}
system("pause");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: