用c語言實現 並查集

2021-10-01 03:49:33 字數 906 閱讀 3280

題目描述

假如已知有n個人和m對好友關係(存於集合r)。如果兩個人是直接或間接的好友(好友的好友的好友…),則認為他們屬於同乙個朋友圈。請寫程式求出這n個人裡一共有多少個朋友圈。

輸入輸入包含多個測試用例,每個測試用例的第一行包含兩個正整數 n、m,1 < = n,m< =100000。接下來有m行,每行分別輸入兩個人的編號f,t(1 < = f,t < = n),表示f和t是好友。 當n為0時,輸入結束,該用例不被處理。

輸出對應每個測試用例,輸出在這n個人裡一共有多少個朋友圈。每組一行。

樣例輸入

5 31 2

2 34 5

3 31 2

1 32 3

0樣例輸出21

提示例如,對於第乙個例子:n = 5 , m = 3 , r = , , },表示有5個人,1和2是好友,2和3是好友,4和5是好友,則1、2、3屬於乙個朋友圈,4、5屬於另乙個朋友圈,結果為2個朋友圈。

**實現如下

#include

using

namespace std;

int f[

100005

],n, m,k,sum=0;

void

init()

//先讓每個人都知道自己,將其對應值給自己

}int

getf

(int v)

//遞迴找到最大的朋友

}void

merge1

(int v,

int u)

//合併兩個圈子的函式

}int

main()

for(i=

1;i<=n;i++

)//判斷有幾個團體;

cout

}}

並查集 C語言實現

include define maxsize 1000 void init int int intgetf int intdisjointsetmerge int int int f maxsize 我也不知道如何把遞迴函式中不用全域性變數 先閱讀主函式是乙個好習慣 intmain for int ...

Kruskal演算法的C語言實現(並查集版)

問題 kruskal演算法求加權連通圖的最小生成樹的演算法。kruskal演算法總共選擇n 1條邊,所使用的貪婪準則是 從剩下的邊中選擇一條不會產生環路的具有最小耗費的邊加入已選擇的邊的集合中。注意到所選取的邊若產生環路則不可能形成一棵生成樹。kruskal演算法分e 步,其中e 是網路中邊的數目。...

C 實現並查集

將n個不同的元素分成一組不相交的集合。開始時,每個元素就是乙個集合,然後按規律將兩個集合進行合併。假如已知有n個人和m對好友關係 存於陣列r 如果兩個人是直接的或間接的好友關係 好友的好友的好友.則認為他們屬於同一好友圈,請求出這n個人中有幾個好友圈。例如 n 5,m 3,r 表示有5個人,1和2是...