• 二叉树—并查集


    注意:下标必须是人物编号,且从1—INF

    1.核心代码:

    #include<iostream>
    using namespace std;
    const int maxn=1000;
    class Ufstree
    {
        struct node
        {
            int data;
            int rank;
            int par;//parent
        };
        node t[maxn];
        int len; 
        public :
            void make_set(int n)
            {
                len=n;
                for(int i=1;i<=n;i++)
                {
                     t[i].par=i;
                     t[i].rank=0;
                } 
            }
            int find_set(int x)
            {
                return x==t[x].par ? x:find_set(t[x].par);
            }
            void mixed(int x,int y)
            {
                int fx=find_set(x);
                int fy=find_set(y);
                if(t[fx].rank>t[fy].rank)
                   t[fy].par=fx;
                else
                {
                    t[fx].par=fy;
                    if(t[fx].rank==t[fy].rank)
                       t[fy].rank++;
                }
            }
            int find_num()//集合的个数 
            {
                int num=0;
                for(int i=1;i<=len;i++)
                   if(t[i].par==i)
                      num++;
                return num;
             } 
    };
    View Code

    2.完整代码加例题:

    #include<iostream>
    using namespace std;
    const int maxn=1000;
    class Ufstree
    {
        struct node
        {
            int data;
            int rank;
            int par;//parent
        };
        node t[maxn];
        int len; 
        public :
            void make_set(int n)
            {
                len=n;
                for(int i=1;i<=n;i++)
                {
                     t[i].par=i;
                     t[i].rank=0;
                } 
            }
            int find_set(int x)
            {
                return x==t[x].par ? x:find_set(t[x].par);
            }
            void mixed(int x,int y)
            {
                int fx=find_set(x);
                int fy=find_set(y);
                if(t[fx].rank>t[fy].rank)
                   t[fy].par=fx;
                else
                {
                    t[fx].par=fy;
                    if(t[fx].rank==t[fy].rank)
                       t[fy].rank++;
                }
            }
            int find_num()//集合的个数 
            {
                int num=0;
                for(int i=1;i<=len;i++)
                   if(t[i].par==i)
                      num++;
                return num;
             } 
    };
    int main()
    {
        int n,m;
        Ufstree t;
        while(cin>>n>>m)
        {
            if(n==0&&m==0)
               break;
            bool flag=true;
            t.make_set(n);
            while(m--)
            {
                int a,b;
                cin>>a>>b;
                int fa=t.find_set(a);
                int fb=t.find_set(b);
                if(fa==fb)
                   flag=false;
                else
                    t.mixed(fa,fb); 
             }
             if(flag&&t.find_num()==1)
                cout<<"Yes
    ";
            else
                cout<<"No
    ";            
        }
        return 0;
    }
    View Code

    例题地址:http://tk.hustoj.com/status.php?user_id=shenyu

  • 相关阅读:
    python反射
    numpy笔记
    leetcode43
    leetcode-42
    The Github Flow
    leetcode-37
    leetcode-41
    leetcode-40
    TCP扫盲2
    字节码分析与操作
  • 原文地址:https://www.cnblogs.com/shenyuling/p/10003369.html
Copyright © 2020-2023  润新知