日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java并查集找朋友圈_图—并查集(解决朋友圈问题)

發布時間:2023/12/20 编程问答 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java并查集找朋友圈_图—并查集(解决朋友圈问题) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

圖也是一種 非線性結構,是由多個頂點組成的關系集合組成的一種數據結構。圖可以分為兩種,無向圖和有向圖。

★圖的定義:

★典型問題:

利用圖能夠解決很多問題,這里有一個較為典型的問題,假如已知有n個人和m對好友關系(存于數字r)。如果兩個人是直接或者間接的好友(即就是好友的好友...),則認為他們屬于一個朋友圈,請寫出程序求出這n個人里一共有多少個朋友圈。

例如:n = 5, m = 3, r = {{1,2},{2,3},{4,5}}, 表示有5個人,1和2是朋友,2和3也是朋友,4和5是朋友,則1,2,3屬于一個朋友圈,4、5屬于另一個朋友圈,結果為2個朋友圈。

★解題思路:

首先,先介紹一個概念:并查集。并查集就是將N個不同元素分成一組不想交的集合,開始時,每個元素就是一個集合,然后按規律將兩個集合進行合并。具體的做法如下:

設定一個有N個元素的數組,將每個元素對應的位置都置為-1,即就是先讓其沒有相交,然后根據題目中給出的朋友關系,將根節點元素對應的位置減1,將與根節點是好友的元素對應的位置更改為根節點元素,按照這樣的方式,將所有的關系都進行對應,最后數組中如果是負數,所對應的元素就是根節點。

★具體代碼:#pragma?once

#include?

//實現圖??——并查集

/*

主要功能:給定一個范圍,能夠確定朋友圈的個數

*/

class?UnionFindSet

{

public:

UnionFindSet(size_t?size)????//構造函數

:_n(size)

,?_set(new?int[size])

{

for?(int?i?=?0;?i?

{

_set[i]?=?-1;

}

}

void?Union(int?root1,?int?root2)????//結合兩個根節點

{

assert(_set[root1]?

assert(_set[root2]?

_set[root1]?+=?_set[root2];

_set[root2]?=?root1;

}

size_t?FindRoot(int?child)

{

if?(_set[child]?

{

return?child;

}

int?num?=?_set[child];

while?(num?>=?0)

{

num?=?_set[num];

}

return?num;

}

void?print()

{

int?root?=?0;

for?(int?i?=?0;?i?

{

if?(_set[i]?

{

root++;

}

}

cout?<

}

protected:

int*?_set;????//數組指針

size_t?_n;?????//給定范圍數據的個數

};

void?Test()

{

UnionFindSet?ht(10);

ht.Union(0,?6);

ht.Union(0,?7);

ht.Union(0,?8);

ht.Union(1,?4);

ht.Union(1,?9);

ht.Union(2,?3);

ht.Union(2,?5);

ht.print();

}

總結

以上是生活随笔為你收集整理的java并查集找朋友圈_图—并查集(解决朋友圈问题)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。