【POJ】[2236]Wireless Network

这里写图片描述
这里写图片描述

也是颓废了好几天啊~
来补一补练习吧

这一题的思路是结合并查集的操作

当遇见 ‘O’ 时
对所有点查找
找出符合
1.电脑已修复
2.与此电脑的距离不大于D
当满足时
便可以进行合并操作

为此需要记录并计算各个点的距离

遇见S时
则查找两点是否为同一集合

PS:
1.注意吸收换行(getchar();)
2.单词别打错(别问我怎么知道的……)

#include<stdio.h>
#include<math.h>
#include<string.h>
int par[1020];
int rank[1020];
int find(int m) {
    if(par[m]==m)
        return m;
    else {
        return par[m]=find(par[m]);
    }
}
void unite(int x,int y) {
    x=find(x);
    y=find(y);
    if(x==y)
        return;
    else {
        if(rank[x]<rank[y]) {
            par[x]=y;
        } else {
            par[y]=x;
            if(rank[x]==rank[y]) {
                rank[x]++;
            }
        }
    }
}

int main() {
    int N,D;
    scanf("%d %d",&N,&D);
    int xy[1020][2];
    int flag[1020];
    memset(flag,0,sizeof(flag));
    for(int i=1; i<=N; i++) {
        par[i]=i;
        rank[i]=0;
    }
    for(int i=1; i<=N; i++) {
        scanf("%d %d",&xy[i][0],&xy[i][1]);
    }
    char c;
    getchar();
    while(scanf("%c",&c)!=EOF) {
        if(c=='O') {
            int t;
            scanf("%d",&t);
            flag[t]=1;
            for(int i=1; i<=N; i++) {
                if(flag[i]==1&&i!=t) {
                    if((xy[i][0]-xy[t][0])*(xy[i][0]-xy[t][0])+(xy[i][1]-xy[t][1])*(xy[i][1]-xy[t][1])<=D*D) {
                        unite(i,t);
                    }
                }
            }
        } else if(c=='S') {
            int p1,p2;
            scanf("%d %d",&p1,&p2);
            if(find(p1)==find(p2)) {
                printf("SUCCESS\n");
            } else
                printf("FAIL\n");
        }
        getchar();
    }
    return 0;
}

题目地址:【POJ】[2236]Wireless Network

posted @ 2016-02-05 02:05  BoilTask  阅读(11)  评论(0编辑  收藏  举报