正文

并查集的应用PKU22362008-08-21 13:10:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/lqf110/37756.html

分享到:

///////////////////////////////////////////作品名称:并查集应用//作者姓名:梁岳传//作品时间:2008-8-16//最后修改:2008-8-16//Q Q 号码:280282813//版权所有,翻版必究////////////////////////////////////////#include<iostream>#include<cmath>using namespace std;typedef struct{    int x;    int y;    int parent;}Node;class Set{    public:        Node* ary;        int length;    public:        int Find(int index);        bool Union(int first, int second);        Set(int n);        virtual ~Set(){delete[]ary;}};Set::Set(int n){    int i;    ary = new Node[n+10];    length = n;    for(i = 1; i <= n; ++i)    {        cin>>ary[i].x>>ary[i].y;        ary[i].parent = -1;    }}//将每次查找过的路线上的结点全部都指向根结点int Set::Find(int index){    int i, j, t;    if(index <= 0 || index > length) return -1;//查找index元素的根结点    for(i = index; ary[i].parent > 0; i = ary[i].parent);//将这条路线上的所有元素全部指向根结点    for(j = index; j != i; j = t){        t = ary[j].parent;        ary[j].parent = i;    }    return i;}//树的根结点保存树的元素个数,以负值的形式保存bool Set::Union(int first, int second){    int i, j;    if(first <= 0 || first > length)        return false;    if(second <= 0 || second > length)        return false;//寻找两个元素所在树的根结点    i = Find(first);    j = Find(second);//越过边界或者两个元素已经在同一棵树中    if(i == j)        return false;//如果第i棵树的元素比第j棵树的元素要多则将j加入到i中    if(ary[i].parent < ary[j].parent){        ary[i].parent += ary[j].parent;        ary[j].parent = i;    }//否则将i加入到j中    else{        ary[j].parent += ary[i].parent;        ary[i].parent = j;    }    return true;}int main(int argv, char* argc[]){    int num, dmax, ct;    char ch;    int i, first, second;    int que[1100];    cin>>num>>dmax;    Set set(num);    ct = 0;    getchar();    while(scanf("%c", &ch) != EOF){        if(ch == 'O'){            scanf("%d", &first);            que[ct] = first;              for(i = 0; i < ct; ++i){                if(sqrt((double)(set.ary[que[i]].x-set.ary[first].x)*(set.ary[que[i]].x-set.ary[first].x) \                    +(set.ary[que[i]].y-set.ary[first].y)*(set.ary[que[i]].y-set.ary[first].y)) <= dmax)                set.Union(first, que[i]);            }            ct++;        }        else{            scanf("%d%d", &first, &second);            if(set.Find(first) == set.Find(second))                cout<<"SUCCESS"<<endl;            else cout<<"FAIL"<<endl;        }        getchar();    }    return 0;}

阅读(6824) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册