poj 2236 Wireless Network(并查集+一点点计算几何)

来源:互联网 发布:在线课堂网站源码 编辑:程序博客网 时间:2024/05/19 19:42

题目链接:http://poj.org/problem?id=2236
题意:地震后网坏掉了,现在修网,O代表的修理网络,S代表的检查连同,如果检查连同就输出“SUCCESS”,如果失败就检查”FAIL”,
输入 第一行 a,b a代表的是总共有多少台电脑,接下来的a行是每个电脑的坐标,b代表的是两个电脑距离多少是连通的。。
之后的s,o就如上述所说。。。
简而言之就是考察连通性。。。我在电脑距离和题目要求距离那里wa了很多次,后发现了原来的距离如果用double型和int 型的 b比较就是坑。可能是sqrt算的有误差吧。。之后改成 int型进行比较就没毛病了。
这题还给我这个弱鸡一个教训,一定要先理清思路,全部的细节再写,不然写完一个想法wa了就白费时间了。qaq
代码:

#include<cstdio>#include<cstring>#include<cmath>using namespace std;const int max=1010;int pa[max],a[max][2],vis[max];inline void init(int n){//初始化    for(int i = 1 ;i <= n; i++)        pa[i] = i;}int find( int n ){//查找,递归路径压缩    if(pa[n] != n) pa[n] = find(pa[n]);    return pa[n];}void unite( int x , int y ){//放在一颗树里    int fx = find(x);    int fy = find(y);    if(fx != fy) pa[fy] = fx;}int juli( int m , int j ){ //主要是这块。。变成double型后有误差然后就gg了    int x1 = a[j][0] - a[m][0];    int y1 = a[j][1] - a[m][1];    int D = x1*x1+y1*y1;    return D;}int main(){   int f,n,k=0,d;   scanf("%d%lf",&n,&d);   init(n);   memset(vis,0,sizeof(vis));   for(int i = 1 ; i <= n ; i++)     scanf("%d%d",&a[i][0],&a[i][1]);   getchar();   char c; int m,x,y;   while(~scanf("%c",&c)){       if(c == 'O'){        scanf("%d",&m);        vis[m] = 1;        for(int i=1;i<=n;i++){            if(find(i)==find(m)||vis[i]==0) continue;            f=juli(i,m);            if(f<=d) unite(m,i);        }        } else {         scanf("%d%d" , &x , &y);         if(vis[x] == 0||vis[y] == 0||find(x) != find(y)) printf("FAIL\n");         else printf("SUCCESS\n");          }getchar();   }       return 0;}
原创粉丝点击