並查集就是把節點放在陣列list裡面,初始化讓list裡面的每個位置都等於該位置角標。之後填入資料(用union),union就是先找根,如果根不一樣,就把aroot並到broot底下。完成填入操作後,如果list裡面的某個i還是角標本身,就說明這個點是根節點。
pta 1107 social clusters
大意是給了n個人,每個人有一些愛好,如果有相同愛好就是好朋友。這樣的話就會形成乙個好朋友社交圈。為你最後有幾個這樣的大圈。
解:
用乙個course陣列儲存愛好,一開始都是0,當第一次出現某個人有這個愛好的時候,就把course陣列裡面對應的愛好記成這個人的編號。這樣下次出現這個愛好的時候,就把下次出現的人的編號和已經儲存的編號相連。 這樣就完成了list填入。
之後都是常規操作了。
核心還是要會寫findroot以及union函式。
#include
#include
#include
using
namespace std;
const
int maxnum =
1005
;const
int hobbynum =
1001
;int course[hobbynum]=;
int list[maxnum]
;void
intil()
intfindroot
(int a)
//找某節點的根
void
union
(int a,
int b)
bool
cmp(
int a,
int b)
intmain()
}}int differgroups =0;
vector<
int>
res(n+1)
;//計算人數的雜湊表
for(
int i =
1; i <= n; i++
)sort
(res.
begin()
, res.
end(
), cmp)
;//排序輸出
cout << differgroups <<
"\n"
;for
(int i =
0; i < differgroups; i++
)return0;
}
用時:60min
大意:給你一組層序遍歷的序列,讓你判斷這個完全二叉樹是不是堆,並且是哪種堆。
思路:根據vec[1]和vec[0]來先初步判斷是哪種堆。然後寫出具體的判斷程式,拿兒子和根比較來判斷。
注意:全域性變數ismax和ismin要重置!(這個bug浪費了半個多小時)
#include
#include
using
namespace std;
vector<
int> vec;
vector<
int> res;
int ismax =
1, ismin =1;
void
ismaxheap
(int i,
int len)
if(right < len)
}void
isminheap
(int i,
int len)
if(right < len)
}void
postorder
(int i,
int len)
intmain()
if(vec[1]
<= vec[0]
)//疑似大頂堆
else
if(vec[1]
>= vec[0]
)//疑似小頂堆
postorder(0
,n);
for(
int i =
0; i < n; i++
) cout <<
"\n"
; vec.
clear()
;//清除,為下一組做準備
res.
clear()
; ismax =
1,ismin =1;
//復位
}return0;
}
python刷題 並查集
class unionfind def init self self.co 0 用於記錄群的個數 self.parent 索引是每個節點本身,值是每個節點的父節點 self.size 用於記錄每個群的節點數目 def find self,x while self.parent x x self.pa...
PTA刷題 甲級 拓撲排序
拓撲排序以前不考,現在考的頻率好高。其實沒啥難的,抓住一點 入度為0時,才能被輸出 或者被選中,乙個意思 所以要用個int indegree來維護入度的數量。當要我們判斷乙個圖能不能是拓撲排序 即沒有環 就是看入過佇列的節點數是不是就是n。例題 大意 給你乙個圖,讓你判斷能不能拓撲排序。輸入資料 輸...
pat甲級1107 並查集
並查集在findfather 函式中進行壓縮路徑,陷阱是這裡只壓縮該結點以上到根的路徑,其以下的路徑不壓縮,這裡不搞清楚會有三個測試點過不去 include include include using namespace std int n vector int hobby 1001 int fat...