青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

/*
  Name: 并查集UFSet類
  Copyright: 始發于goal00001111的專欄;允許自由轉載,但必須注明作者和出處
  Author: goal00001111
  Date: 23-12-08 15:21
  Description: 實現了普通的查找和合并的算法,也實現了壓縮路徑和按大小求并高效算法,并對兩者進行了測試比較。
有關算法的分析討論詳見拙作《一種簡單而有趣的數據結構--并查集》:
http://blog.csdn.net/goal00001111/archive/2008/12/24/3595844.aspx
*/
#include <iostream>
#include <time.h>

using namespace std;

const int MAX = 50000; //集合的最大成員數量

class UFSet{ //并查集類
public:
    UFSet(int s = MAX); //構造函數
   
    UFSet(const UFSet & obj); //拷貝構造函數
   
    ~UFSet() //析構函數
    {
        delete []father;
    }
   
    UFSet & operator = (const UFSet & obj); //賦值函數
    
    int FindFather(int pos); //尋找序號pos的族長大人
   
    bool Unite(int posI, int posJ);//將成員posI和posJ合并到同一個家族
   
    int FindFatherAndReducePath(int pos); //查找族長并壓縮路徑
   
    bool UnionBySize (int posI, int posJ); //按大小求并
   
    bool SameFamily(int posI, int posJ); //判斷成員posI和posJ是否屬于同一家族
   
    void PrintUFSet();

private:
    int *father; //并查集成員數組,存放各元素的父親結點
    int size;   //并查集成員數量
};

UFSet::UFSet(int s) : size(s) //構造函數
{
    father = new int[size + 1];
    for (int i=0; i<=size; i++) //所有的數組元素值均初始化為-1
        father[i] = -1;
}

UFSet::UFSet(const UFSet & obj) //拷貝構造函數
{
    size = obj.size;
    father = new int[size + 1];
    for (int i=0; i<=size; i++)
        father[i] = obj.father[i];
}


UFSet & UFSet::operator = (const UFSet & obj) //賦值函數
{
    if (this == &obj) //檢查自賦值
        return *this;
   
    delete []father; //釋放原有的內存資源
   
    size = obj.size;  //分配新的內存資源,并復制內容
    father = new int[size + 1];
    for (int i=0; i<=size; i++)
        father[i] = obj.father[i];
       
    return *this; //返回本對象的引用
}

int UFSet::FindFather(int pos)//尋找序號pos的族長大人。若pos本身是族長,則返回自身
{
    if (father[pos] < 0)
        return pos;
       
    return FindFather(father[pos]);
}

bool UFSet::Unite(int posI, int posJ)//將成員posI和posJ合并到同一個家族
{
    //首先各自去尋找自己的族長
    int fI = FindFather(posI);
    int fJ = FindFather(posJ);
   
    if (fI == fJ) //如果是同一個族長門下,不必合并,即合并失敗
        return false;
    else
        father[fJ] = fI; //否則fI當族長:誰讓posI站在posJ的前面呢!
       
    return true;
}

int UFSet::FindFatherAndReducePath(int pos)//查找族長并壓縮路徑
{
    if (father[pos] < 0)
        return pos;
    //若自己不是族長,則找到族長后,將所途經的結點均指向族長   
    return father[pos] = FindFatherAndReducePath(father[pos]);
}

bool UFSet::UnionBySize(int posI, int posJ)//按大小求并
{
    //首先各自去尋找自己的族長
    int fI = FindFatherAndReducePath(posI);
    int fJ = FindFatherAndReducePath(posJ);
   
    if (fI == fJ) //如果是同一個族長門下,不必合并,即合并失敗
        return false;
    else if (father[fI] < father[fJ])
    {//如果族長fI的實力比fJ強,即|fI|>|fJ|,則fI當族長,并修改father[fI]和father[fJ]
        father[fI] += father[fJ];
        father[fJ] = fI;
    }
    else              //否則fJ當族長
    {
        father[fJ] += father[fI];
        father[fI] = fJ;
    }
   
    return true;
}

bool UFSet::SameFamily(int posI, int posJ)//判斷成員posI和posJ是否屬于同一家族
{
    return FindFatherAndReducePath(posI) == FindFatherAndReducePath(posJ);
}

void UFSet::PrintUFSet()//輸出集合的所有元素
{
    for (int i=0; i<=size; i++)
        cout << father[i] << ' ';
    cout << endl;
}

int main()
{
    time_t startTime, endTime;
    UFSet obj;
    int p, q;
   
    time(&startTime);
   
    for (int i=0; i<MAX; i++)
    {
        p = rand() % MAX + 1;
        q = rand() % MAX + 1;
        if (p == q)
            continue;
           
        //cout << p << "-" << q << "   ";
//        if (i % 10 == 0)
//            cout << endl;
       
        obj.Unite(p, q);
    }
   
    while (1)
    {
        p = rand() % MAX + 1;
        q = rand() % MAX + 1;
        if (p == q)
            continue;
       
        if (obj.SameFamily(p, q))
            cout << endl << p << "≡" << q << endl;
        else
            cout << endl << p << "!≡" << q << endl;
        break;
    }
   
    time(&endTime);
    cout << difftime(endTime, startTime) << endl;
   
    //////////////////////////////////////////////////////////////////////////
    time(&startTime);
    for (int i=0; i<MAX; i++)
    {
        p = rand() % MAX + 1;
        q = rand() % MAX + 1;
        if (p == q)
            continue;
           
        //cout << p << "-" << q << "   ";
//        if (i % 10 == 0)
//            cout << endl;
       
        obj.UnionBySize(p, q);
    }
   
    while (1)
    {
        p = rand() % MAX + 1;
        q = rand() % MAX + 1;
        if (p == q)
            continue;
       
        if (obj.SameFamily(p, q))
            cout << endl << p << "≡" << q << endl;
        else
            cout << endl << p << "!≡" << q << endl;
        break;
    }
   
    time(&endTime);
    cout << difftime(endTime, startTime) << endl;
   
    system("pause");
    return 0;
}
Posted on 2008-12-24 13:41 夢想飛揚 閱讀(1282) 評論(0)  編輯 收藏 引用
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            久久免费视频在线观看| 午夜精品久久久久久久99水蜜桃 | 亚洲作爱视频| 亚洲国产美女精品久久久久∴| 欧美一级淫片播放口| 欧美国产在线观看| 亚洲尤物在线| 亚洲午夜一区二区三区| 亚洲国产一区视频| 午夜精品999| 亚洲综合电影| 香蕉久久a毛片| 欧美精品18| 欧美mv日韩mv亚洲| 欧美精品日韩三级| 欧美日韩一区二区三区在线观看免| 欧美激情亚洲综合一区| 久久欧美中文字幕| 米奇777超碰欧美日韩亚洲| 奶水喷射视频一区| 亚洲精品一区二区三区不| 亚洲国产成人高清精品| 欧美成人亚洲成人日韩成人| 亚洲综合国产激情另类一区| 99精品视频免费观看视频| 亚洲视频在线免费观看| 欧美激情小视频| 欧美激情精品久久久久| 亚洲人成人77777线观看| 亚洲高清激情| 国产精品99久久久久久久久| 一区二区三区波多野结衣在线观看| 欧美日韩国产在线一区| 欧美日韩亚洲一区二| 欧美日韩免费看| 欧美激情一区二区三区在线| 欧美日韩精品不卡| 国产欧美一二三区| 久久裸体艺术| 91久久久久久国产精品| 夜夜夜久久久| 久久久久久久一区| 欧美日韩国产小视频| 国产午夜精品视频免费不卡69堂| 亚洲国产三级在线| 亚洲日本欧美天堂| 午夜精品婷婷| 亚洲国产成人久久综合| 午夜精品福利电影| 欧美国产精品日韩| 欧美成人精品在线播放| 国产精品自拍视频| 狠狠久久五月精品中文字幕| 亚洲午夜精品网| 欧美福利视频在线| 香港久久久电影| 欧美日韩一本到| 亚洲激情一区| 狂野欧美激情性xxxx| 亚洲午夜免费视频| 欧美精品九九| 亚洲国产婷婷香蕉久久久久久99| 久久国产99| 亚洲欧洲日本国产| 久久亚洲精品伦理| 国产一区二区三区无遮挡| 日韩视频欧美视频| 欧美激情一区| 亚洲一区中文| 欧美午夜电影一区| 亚洲狼人精品一区二区三区| 快she精品国产999| 久久久91精品国产一区二区精品| 你懂的视频一区二区| 欧美午夜精品电影| 99视频一区二区| 亚洲国产经典视频| 欧美成人一区二区三区| 亚洲人成在线播放网站岛国| 欧美成人午夜| 欧美成人精品一区二区三区| 久久九九热免费视频| 久久精品视频免费播放| av成人免费观看| 国产精品成人在线| 亚洲一级网站| 亚洲视屏在线播放| 国产精品久久激情| 午夜精品福利视频| 亚洲一区二区成人在线观看| 国产精品国产一区二区| 亚洲免费婷婷| 亚洲精品网址在线观看| 欧美日韩精品免费观看视频| 狠狠色2019综合网| 欧美高清视频www夜色资源网| 久久精品国产成人| 久久青草久久| 亚洲精品影院在线观看| 日韩性生活视频| 国产色综合久久| 欧美成人xxx| 欧美日本一区二区高清播放视频| 亚洲午夜国产成人av电影男同| 亚洲一区二区三区乱码aⅴ蜜桃女 亚洲一区二区三区乱码aⅴ | 一区二区三区四区五区精品视频| 亚洲免费观看高清在线观看| 欧美午夜视频| 久久尤物视频| 欧美日韩国产bt| 久久国产婷婷国产香蕉| 蜜臀久久久99精品久久久久久| 一区二区高清在线| 午夜视频一区| 日韩亚洲精品电影| 亚洲一区综合| 国产精品久久一级| 欧美在线三区| 亚洲欧美国产日韩中文字幕| 一区二区亚洲| 一区二区三区视频在线看| 国产亚洲精品一区二区| 亚洲国产精品一区二区久| 国产精品一区二区久激情瑜伽| 毛片一区二区| 国产精品久久久久久久午夜片| 美日韩精品免费观看视频| 欧美日韩少妇| 欧美大片第1页| 国产日韩欧美91| 亚洲精品国产精品国自产观看浪潮 | 一区免费在线| 欧美激情一区二区三区不卡| 国产精品一区二区你懂的| 亚洲电影第三页| 国产一区二区三区在线观看视频| 亚洲精品在线免费| 欧美va亚洲va国产综合| 在线视频免费在线观看一区二区| 午夜在线播放视频欧美| 欧美一级网站| 欧美三区视频| 在线中文字幕不卡| 日韩网站免费观看| 美日韩免费视频| 亚洲第一成人在线| 亚洲高清中文字幕| 亚洲视频一二| 久久精品欧美日韩| 国产欧美日韩一区二区三区在线| 欧美在线播放高清精品| 久久精品女人的天堂av| 国产亚洲人成a一在线v站| 久久精品一区二区三区不卡| 久久精品一区四区| 久久人人爽爽爽人久久久| 亚洲大片精品永久免费| 日韩午夜在线视频| 欧美日韩国产片| 99视频精品| 欧美一级专区| 国产亚洲欧美一区二区三区| 久久精品国产一区二区电影| 久久精品日产第一区二区三区| 国产老肥熟一区二区三区| 久久一区中文字幕| 99精品视频免费观看视频| 欧美在线观看网址综合| 亚洲第一色中文字幕| 欧美日韩一区二区三区四区在线观看 | 免费在线播放第一区高清av| 亚洲每日在线| 久久一区二区三区av| 夜夜爽av福利精品导航 | 黄色精品网站| 欧美日韩精品免费看| 久久超碰97人人做人人爱| 亚洲精品久久久久久一区二区| 亚洲欧美日韩在线不卡| 亚洲韩国一区二区三区| 国产精品一区二区久久精品| 欧美国产激情二区三区| 久久九九精品| 香蕉国产精品偷在线观看不卡| 亚洲国产va精品久久久不卡综合| 欧美在线啊v| 制服丝袜亚洲播放| 亚洲黄色天堂| 国产一区二区日韩精品| 欧美三级乱人伦电影| 蜜臀av性久久久久蜜臀aⅴ四虎 | 亚洲精品乱码| 在线观看日韩| 国产亚洲精品v| 国产精品视频一| 国产精品美女久久| 欧美区视频在线观看| 亚洲电影免费观看高清完整版| 男女视频一区二区| 欧美一区亚洲二区|