Wireless Network POJ

来源:互联网 发布:办公室网络限制玩游戏 编辑:程序博客网 时间:2024/04/30 21:47

题意:给出一些已经损坏的电脑的坐标,电脑修复后可以与k范围以内的正常工作的电脑连接,给出一些操作,判断能不能成功。


分析:并查集的问题,每修复一台电脑就遍历所有,进行连接。(连接的规则是尽量往先修复的连接,规则随意)


收获:刚开始学习并查集,并查集的建立是基于向上查找父亲,同一父亲就是属于同一个集合。


AC:

#include <iostream>    #include <string.h>    #include <stdio.h>    using namespace std;    const int N = 1005;    struct Point    {        int x,y;    };    Point p[N];    int repaired[N];    int pre[N],rank[N];    int dist(Point A,Point B)    {        return (A.x-B.x)*(A.x-B.x)+(A.y-B.y)*(A.y-B.y);    }    void Init(int n)    {        for(int i=1;i<=n;i++)        {            pre[i] = i;            rank[i] = 1;        }    }    int Find(int x)    {        if(pre[x] != x)            pre[x] = Find(pre[x]);        return pre[x];    }    void Union(int x,int y)    {        x = Find(x);        y = Find(y);        if(x == y) return;        if(rank[x] >= rank[y])        {            pre[y] = x;            rank[x] += rank[y];        }        else        {            pre[x] = y;           rank[y] += rank[x];        }    }    int main()    {        char ch[5];        int n,d,x,y;        scanf("%d%d",&n,&d);        for(int i=1;i<=n;i++)            scanf("%d%d",&p[i].x,&p[i].y);        int cnt = 0;        Init(n);        while(~scanf("%s",ch))        {            if(ch[0] == 'O')            {                scanf("%d",&x);                for(int i=0;i<cnt;i++)                {                    if(dist(p[repaired[i]],p[x]) <= d*d)                        Union(repaired[i],x);                }                repaired[cnt++] = x;            }            else            {                scanf("%d%d",&x,&y);                x = Find(x);                y = Find(y);                if(x == y) puts("SUCCESS");                else       puts("FAIL");            }        }        return 0;}


0 0
原创粉丝点击