Set

集合操作过程:最重要掌握集合总并查集:使用结构体数组对其进行模拟,根节点负数表示(-3 表示此集合中有三次子节点),同时采用双亲表示法,子节点采Parent

#include<iostream>
using namespace std;
#define ElementType int
//使用结构体数组表示树
//typedef ElementType SetType[10];
typedef struct SetType{
    ElementType Data;
    int Parent;
}settype;
int Find(SetType S[],int X,int N)
{
    //先找到X在数组中位置
    int i=0;
    for(i=0;i<N &&S[i].Data!=X;i++);
    if(i>=N) return -1;
    for(;S[i].Parent>=0;i=S[i].Parent);
    
    return i;
}
void Union(int X1,int X2,SetType S[],int N)
{
    //-1 *size,表示数量
    int Root1=Find(S,X1,N);
    int Root2=Find(S,X2,N);
    if(S[Root1].Parent<S[Root2].Parent)
    {
        S[Root1].Parent=S[Root1].Parent+S[Root2].Parent;
       S[Root2].Parent=Root1;
    }
    else
    {
        S[Root2].Parent=S[Root1].Parent+S[Root2].Parent;
       S[Root1].Parent=Root2;
    }
    for(int i=0;i<N;i++)
        {
            cout<<S[i].Data<<" "<<S[i].Parent<<endl;

        }
}
int main()
{       int Total;
        cin>>Total;
        SetType *Set=new SetType[Total];
        int a,b;
        for(int i=0;i<Total;i++)
        {
            cin>>a>>b;
            Set[i].Data=a;
            Set[i].Parent=b;

        }
        cout<<"对数组输出测试"<<endl;
        for(int i=0;i<Total;i++)
        {
            cout<<Set[i].Data<<" "<<Set[i].Parent<<endl;

        }
        int X,Root1,Root2;
        cin>>X;
        Root1=Find(Set,X,Total);
        cout<<"根节点是"<<Root1;
        cout<<"节点合并"<<endl;
        cin>>Root1>>Root2;
        Union(Root1,Root2,Set,Total);
    return 0;
}

 

原文地址:https://www.cnblogs.com/woainifanfan/p/6042099.html