POJ 2236 Wireless Network(并查集加判断)

来源:互联网 发布:淘宝怎么看客服业绩 编辑:程序博客网 时间:2024/05/17 09:19

本题的大致题意为:给出n个电脑,n对电脑,表示电脑直接相连。但现在所有的电脑都是坏掉的,所以要对其进行维修。如果字符是’O’,则代表维修某个点。如果字符为’S’,则测试某两点是不是联通。但是要注意的一点是在判断两点间是不是联通的前提条件是这两点的距离小于d。
下面给出AC代码。

#include<cstdio>#include<cstring>#include<algorithm>using namespace std;#define maxn 1005int a[maxn],b[maxn],flag[maxn];//flag数组标记某电脑是否修好。a和b 数组都是储存点int pre[maxn];int n,d;int find(int x){    if(pre[x]==x)return x;        else return find(pre[x]);}int join(int x,int y){    int t1=find(x);    int t2=find(y);    if(t1!=t2)    {        pre[t1]=t2;    }}int dis(int x,int y){    int dis1=a[x]-a[y];    int dis2=b[x]-b[y];    if(dis1*dis1+dis2*dis2<=d*d)        return 1;    else        return 0;}int main(){    scanf("%d%d",&n,&d);    for(int i=1;i<=n;i++)    {        scanf("%d%d",&a[i],&b[i]);    }    for(int i=1;i<=n;i++)    {        pre[i]=i;        flag[i]=0;    }    char s;    while(~scanf("%c",&s))    {        int num1,num2;        if(s=='O')        {            scanf("%d",&num1);            flag[num1]=1;            for(int i=1;i<=n;i++)            {                if(i!=num1&&flag[i]==1&&dis(i,num1))                {                    join(i,num1);                }            }        }        if(s=='S')        {            scanf("%d%d",&num1,&num2);            if(find(num1)!=find(num2))            {                printf("FAIL\n");            }            else printf("SUCCESS\n");        }    }    return 0;}
0 0
原创粉丝点击