並查集:
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.物件導向程式設計 遇到問題馬上想到有沒有乙個物件具有解決這個問題的能力,如果有直接拿過來用,沒...