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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

并查集(UnionFindSet)

發布時間:2023/12/2 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 并查集(UnionFindSet) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
小米的校招題:
朋友圈(25分)
假如已知有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個朋友圈。
最后請分析所寫代碼的時間、空間復雜度。評分會參考代碼的正確性和效率。
C/C++:
int friends(int n , int m , int* r[]);

思路:此題可以用并查集來解決,并查集數組剛開始里面存的都是-1,把每個圈子看成一個樹,把其非根結點的-1都加到根節點里面去,然后非根節點存上根節點的下標,這樣遍歷數組時,為負數的就是根,負幾那個朋友圈就有幾個人,那幾個人就是存這個根下標的元素。
具體實現如下:


  • #include<iostream>
  • #include<cassert>
  • using namespace std;

  • int?FindRoot(int?*set,int?child)
  • {
  • ????assert(set);
  • ????while(set[child]?>=?0)
  • ????{
  • ????????child?=?set[child];
  • ????}
  • ????return child;
  • }
  • void Combine(int?*set,int?root1,int?root2)
  • {
  • ????assert(set);
  • ????set[root1]?+=?set[root2];
  • ????set[root2]?=?root1;
  • }
  • int?FindFrinedsCircle(int?n,int?m,int?r[][2])
  • {
  • ????assert(r);

  • ????int?*set?=?new?int(n);
  • ????memset(set,-1,sizeof(int)*n);

  • ????for(int?i?=?0;i?<?m;++i)
  • ????{
  • ????????int?first?=?r[i][0];
  • ????????int?second?=?r[i][1];

  • ????????int?root1?=?FindRoot(set,first);
  • ????????int?root2?=?FindRoot(set,second);

  • ????????if(root1?!=?root2)
  • ????????{
  • ????????????Combine(set,root1,root2);
  • ????????}
  • ????}
  • ????int?count?=?0;
  • ????for(int?i?=?0;i?<?n;++i)
  • ????{
  • ????????if(set[i]?<?0?)
  • ????????{
  • ????????????count++;
  • ????????}
  • ????}
  • ????return count;
  • }
  • int?main()
  • {
  • ????int?r[][2]?=?{{1?,?2}?,?{2?,?3}?,?{4?,?5}};
  • ????cout<<FindFrinedsCircle(5,3,r)<<endl;
  • ????return 0;
  • }
  • 總結

    以上是生活随笔為你收集整理的并查集(UnionFindSet)的全部內容,希望文章能夠幫你解決所遇到的問題。

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