資料結構 day 17

2021-10-05 14:37:04 字數 1332 閱讀 7724

並查集:

1.將兩個集合合併

2.詢問兩個元素是否在乙個集合當中。

belong[x] = a

if (belongp[x] == belong[y]) 近乎o(1)

基本原理:每個集合用一棵樹來表示,樹根的編號就是整個集合的編號。每個節點儲存它的父節點,p[x]表示x的父節點。

問題1:如何判斷樹根:if (p[x] == x)

問題2:如何求x的集合編號:while (p[x] != x) x = p[x];

問題3:如何合併兩個集合:px是x的集合編號,py 是y的集合編號。p[x] = y.

問題描述

一共有n個數,編號是1~n,最開始每個數各自在乙個集合中。

現在要進行m個操作,操作共有兩種:

1.「m a b」,將編號為a和b的兩個數所在的集合合併,如果兩個數已經在同乙個集合中,則忽略這個操作;

2.「q a b」,詢問編號為a和b的兩個數是否在同乙個集合中;

輸入格式

第一行輸入整數n和m。

接下來m行,每行包含乙個操作指令,指令為「m a b」或「q a b」中的一種。

輸出格式

對於每個詢問指令」q a b」,都要輸出乙個結果,如果a和b在同一集合內,則輸出「yes」,否則輸出「no」。

每個結果佔一行。

資料範圍

1

<=n

,m

<=1

05

1 <= n,m <= 10^5

1<=n

,m<=1

05輸入樣例

4

5m 1

2m 3

4q 1

2q 1

3q 3

4

輸出樣例

yes

noyes

完整**實現

//並查集

#include

using namespace std;

const

int n =

100010

;int n,m;

int p[n]

;int

find

(int x)

//返回x的祖宗節點+路徑壓縮

intmain()

}return0;

}

資料結構和演算法 Day 17

將單鏈表中終端節點的指標端由空指標改為指向頭節點,就使整個單鏈表形成乙個環,這種頭尾相接的單鏈表稱為單迴圈列表,簡稱迴圈列表。迴圈列表的主要差異就在於迴圈的判斷空列表的條件上,原來判斷head next是否為null,現在則是head next是否等於head 終端節點用尾指標rear指示,則查詢終...

實習日記 Day17

今日份 更新 今日份流水賬 需求更新 身為乙方,每當甲方需求更新的時候,應該都很煩吧。但是我發現我自己,也許是性格使然吧,居然覺得能盡可能去滿足客戶的需求,也是一件很有成就感的事。反倒是讓我提需求的話,我會產生一種給別人添麻煩的不適感 不過這也可能是我今日份的感想,換個日子興許就不這樣想了。工具更新...

day17物件導向

1.面向過程程式設計 一遇到問題馬上想到的是怎麼用演算法或者步驟 邏輯 直接解決問題 2.函式式程式設計 一遇到問題馬上想到有沒有乙個函式具有解決這個問題的功能,如果有直接拿過來用,沒有就自己定義乙個 3.物件導向程式設計 遇到問題馬上想到有沒有乙個物件具有解決這個問題的能力,如果有直接拿過來用,沒...