輸入n個人的愛好,愛好相同的在同乙個社交圈,跟書上的好朋友一樣,如果a、b都喜歡活動1,b、c都喜歡活動2,a和b在同一圈,b和c在同一圈,則a和c也在同一圈。
跟書上一樣,書上直接給出朋友關係,本題需要先依靠hobby來判斷是否在同乙個集合,還有就是書上是直接用bool陣列判斷是根節點的個數,本題更進一步,需要求出每個集合中的元素個數。
#include
#include
using
namespace std;
const
int n=
1100
;int father[n]
;//存放父親結點
int hobby[n]=;
//hobby[h]為任何乙個喜歡活動h的人的編號
int isroot[n]=;
intfindfather
(int x)
void
union
(int a,
int b)
}int
cmp(
int a,
int b)
void
init
(int n)
}int
main()
union
(i,findfather
(hobby[h]))
;//合併i跟hobby[h]的集合 }}
for(
int i=
1;i<=n;i++
)int ans=0;
for(
int i=
1;i<=n;i++
)printf
("%d\n"
,ans)
;sort
(isroot+
1,isroot+
1+n,cmp)
;for
(int i=
1;i<=ans;i++
)return0;
}
pat甲級1107 並查集
並查集在findfather 函式中進行壓縮路徑,陷阱是這裡只壓縮該結點以上到根的路徑,其以下的路徑不壓縮,這裡不搞清楚會有三個測試點過不去 include include include using namespace std int n vector int hobby 1001 int fat...
浙大PAT甲級 1107 並查集
這個題目求有共同愛好的人的集體數,以及從大到小輸出各個集體的人數。並查集的思想。我的思路是 用num i 陣列表示根為愛好i的人數個數。最後排序統計不等於的num i 有多少個,然後排序,後序輸出。ac include include include include include include ...
PAT 社交集群(並查集)
輸入在第一行給出乙個正整數 n 1 000 為社交網路平台註冊的所有使用者的人數。於是這些人從 1 到 n 編號。隨後 n 行,每行按以下格式給出乙個人的興趣愛好列表 k i h i 1 h i 2 h i k i 其中k i 0 是興趣愛好的個數,h i j 是第j 個興趣愛好的編號,為區間 1,...