POJ 2236 并查集

来源:互联网 发布:js怎么为radio赋值 编辑:程序博客网 时间:2024/05/20 15:40

Time Limit: 10000MS.........

直接暴力查找。。连通的用并查集处理一下就行了


#include "stdio.h"#include "string.h"#include "math.h"#include "stdlib.h"struct comp{double x,y;} point[1010];int n;double d;int hash[1010];double dis[1010][1010];int fa[1010];double make_dis(int a,int b){return sqrt(  (point[a].x-point[b].x)*(point[a].x-point[b].x)+(point[a].y-point[b].y)*(point[a].y-point[b].y));}int find(int x){if (x!=fa[x])fa[x]=find(fa[x]);return fa[x];}void repair(int x){int i,a,b;hash[x]=1;for (i=1;i<=n;i++)if (i!=x && hash[i]==1 && dis[x][i]-d<1e-10){a=find(x);b=find(i);if (a!=b)fa[a]=b;}} int main(){int i,x,y,j;char ch;scanf("%d%lf",&n,&d);for (i=1;i<=n;i++)scanf("%lf%lf",&point[i].x,&point[i].y);for (i=1;i<=n;i++)for (j=i;j<=n;j++)if (i==j)dis[i][j]=dis[j][i]=0;else dis[i][j]=dis[j][i]=make_dis(i,j);getchar();memset(hash,0,sizeof(hash));for (i=1;i<=n;i++)fa[i]=i;while (scanf("%c",&ch)!=EOF){if (ch=='O') {scanf("%d",&x);repair(x);}else {scanf("%d%d",&x,&y);if (find(fa[x])==find(fa[y])) printf("SUCCESS\n");else printf("FAIL\n");}getchar();}return 0;}



原创粉丝点击