POJ-2236 并查集

来源:互联网 发布:mac地址修改器 yy 编辑:程序博客网 时间:2024/05/19 14:01

不知道STATISTICS中第一页的程序是怎么写出来的。

贴上我的950ms+的代码。

/* * wireless network * mike-w * 2012-4-28 */#include<stdio.h>#include<stdlib.h>#include<string.h>#include<math.h>#define MAX_SIZE 1234double co[MAX_SIZE][2]; /* coordinate */int flag[MAX_SIZE];int set[MAX_SIZE],rank[MAX_SIZE];int N;double D;int set_init(int size){int i;for(i=1;i<=size;i++)set[i]=i,rank[i]=1;return 0;}int set_find(int e){if(set[e]==e)return e;elsereturn set[e]=set_find(set[e]);}int set_merge(int e1, int e2){int r1=set_find(e1);int r2=set_find(e2);if(r1==r2)return -1;if(rank[r1]>rank[r2])set[r2]=r1;else if(rank[r1]<rank[r2])set[r1]=r2;else set[r1]=r2,rank[r2]++;return 0;}int link(int node){int i,dx,dy;flag[node]=1;for(i=1;i<=N;i++){if(flag[i]){dx=co[i][0]-co[node][0];dy=co[i][1]-co[node][1];if(sqrt(dx*dx+dy*dy)<=D)set_merge(i,node);}}return 0;}int main(void){#ifndef ONLINE_JUDGEfreopen("in","r",stdin);#endifint i,e1,e2;char buf[5];scanf("%d%lf",&N,&D);set_init(N);memset(flag,0,sizeof(flag));for(i=1;i<=N;i++)scanf("%lf%lf",co[i],co[i]+1);while(scanf("%s",buf)!=EOF){if(buf[0]=='O')scanf("%d",&e1),link(e1);else{scanf("%d%d",&e1,&e2);puts(set_find(e1)==set_find(e2)?"SUCCESS":"FAIL");}}return 0;}