国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【算法日志】圖論 并查集及其簡(jiǎn)單應(yīng)用

這篇具有很好參考價(jià)值的文章主要介紹了【算法日志】圖論 并查集及其簡(jiǎn)單應(yīng)用。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

【算法日志】圖論: 并查集及其簡(jiǎn)單應(yīng)用

并查集概論

并查集是一種算法設(shè)計(jì)思想,通過判斷兩個(gè)元素是否在同一個(gè)集合里,常用來解決一些和圖相關(guān)的連通性問題。

并查集主要有以下兩個(gè)功能:

  • 將兩個(gè)元素添加到一個(gè)集合中。
  • 判斷兩個(gè)元素是否是在一個(gè)集合之中(這一功能夠有效判斷是否成環(huán))。

主要思想:

通過創(chuàng)建一個(gè)數(shù)組用來保每個(gè)點(diǎn)的最老根節(jié)點(diǎn),以此來實(shí)現(xiàn)并查集的各種功能。

具體模板如下:

int n = 1005; // n根據(jù)題目中節(jié)點(diǎn)數(shù)量而定,一般比節(jié)點(diǎn)數(shù)量大一點(diǎn)就好
vector<int> father = vector<int> (n, 0); // C++里的一種數(shù)組結(jié)構(gòu)
// 并查集初始化
void init() {
    for (int i = 0; i < n; ++i) {
        father[i] = i;
    }
}
// 并查集里尋根的過程
int find(int u) {
    return u == father[u] ? u : father[u] = find(father[u]); // 路徑壓縮
}
// 判斷 u 和 v是否找到同一個(gè)根
bool isSame(int u, int v) {
    u = find(u);
    v = find(v);
    return u == v;
}
// 將v->u 這條邊加入并查集
void join(int u, int v) {
    u = find(u); // 尋找u的根
    v = find(v); // 尋找v的根
    if (u == v) return ; // 如果發(fā)現(xiàn)根相同,則說明在一個(gè)集合,不用兩個(gè)節(jié)點(diǎn)相連直接返回
    father[v] = u;
}

簡(jiǎn)單應(yīng)用

leetcode 1971:尋找是否存在路徑

本題是雙向圖,只要始末點(diǎn)相連就存在有效路徑,因此只需要將合并樹,判斷始末節(jié)點(diǎn)的最老根節(jié)點(diǎn)是否一樣就行。

具體示例代碼如下:文章來源地址http://www.zghlxwxcb.cn/news/detail-818364.html

	void Init(vector<int>& f, const int& n)
	{
		for (int i = 0; i < n; ++i)
			f[i] = i;
	}
	int find(vector<int>& f, int v)
	{
		return v == f[v] ? v : find(f, f[v]);
	}
	bool isSame(vector<int>& f, int v, int u)
	{
		v = find(f, v);
		u = find(f, u);
		return v == u;
	}
	void join(vector<int>& f, int v, int u)
	{
		v = find(f, v);
		u = find(f, u);
		if (v != u)
			f[u] = v;
	}

	bool validPath(int n, vector<vector<int>>& edges, int source, int destination)
	{
		vector<vector<int>> path;
		vector<int> father(n + 1, 0);
		Init(father, n + 1);
		int size = edges.size();
		for (int i = 0; i < size; ++i)
			join(father, edges[i][0], edges[i][1]);
		return isSame(father, source, destination);
	}
leetcode 648: 冗余連接

本題要連接的點(diǎn)在連接前存在共同根節(jié)點(diǎn),那么連接該兩點(diǎn)就會(huì)形成環(huán)路,因此需要移除的邊就是以這兩點(diǎn)為端點(diǎn)的邊。

具體示例代碼如下:

	void Init(vector<int>& f, const int& n)
	{
		for (int i = 0; i < n; ++i)
			f[i] = i;
	}
	int find(vector<int>& f, int v)
	{
		return v == f[v] ? v : find(f, f[v]);
	}
	bool isSame(vector<int>& f, int v, int u)
	{
		v = find(f, v);
		u = find(f, u);
		return v == u;
	}
	void join(vector<int>& f, int v, int u)
	{
		v = find(f, v);
		u = find(f, u);
		if (v != u)
			f[u] = v;
	}
	vector<int> findRedundantConnection(vector<vector<int>>& edges)
	{
		int n = edges.size();
		vector<int> father(n + 1, 0);
		Init(father, n + 1);
		for (int i = 0; i < n; ++i)
		{
			if (isSame(father, edges[i][0], edges[i][1]))
				return { edges[i][0], edges[i][1] };
			join(father, edges[i][0], edges[i][1]);
		}
		return {};
	}

到了這里,關(guān)于【算法日志】圖論 并查集及其簡(jiǎn)單應(yīng)用的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 圖論:并查集的合并、判斷和求節(jié)點(diǎn)

    圖論:并查集的合并、判斷和求節(jié)點(diǎn)

    ?所謂并查集就是可以畫圖理解 假如說我們想要構(gòu)建一個(gè)樹(也是圖),要求1-2,2-4,1-3 在構(gòu)另一個(gè)樹,要求5-6,6-7,5-8 1是2的頭結(jié)點(diǎn),2是4的頭結(jié)點(diǎn),以此類推 下面要求去將5連接到1上,就是我下面要講的,其實(shí)上面的子節(jié)點(diǎn)的連接也是如此的。 簡(jiǎn)單并查集例題: 一共有 n 個(gè)數(shù)

    2024年01月18日
    瀏覽(37)
  • 【數(shù)據(jù)結(jié)構(gòu)】| 并查集及其優(yōu)化實(shí)現(xiàn)

    【數(shù)據(jù)結(jié)構(gòu)】| 并查集及其優(yōu)化實(shí)現(xiàn)

    以一個(gè)直觀的問題來引入并查集的概念。 親戚問題:有一群人,他們屬于不同家族,同一個(gè)家族里的人互為親戚,不同家族的人不是親戚。隨機(jī)指定兩個(gè)人,問他們是否有親戚關(guān)系。 以下圖3個(gè)不相交的集合表示 3 個(gè)家族,當(dāng)詢問兩個(gè)人是否有親戚關(guān)系時(shí),也就是問兩個(gè)元素

    2024年02月09日
    瀏覽(18)
  • 代碼隨想錄圖論并查集 第七天 | 685.冗余連接II

    代碼隨想錄圖論并查集 第七天 | 685.冗余連接II 一、685.冗余連接II 題目鏈接:https://leetcode.cn/problems/redundant-connection-ii/ 思路:684.冗余連接中是連通且無環(huán)的無向圖可直接使用并查集模板,如果想判斷集合中是否有環(huán),且那條邊構(gòu)成環(huán),只需要每次加入并查集之前先判斷一下是

    2024年02月06日
    瀏覽(25)
  • 并查集算法實(shí)現(xiàn)

    ??蜏y(cè)試鏈接 并查集(Disjoint Set)是一種用于處理集合合并與查詢問題的數(shù)據(jù)結(jié)構(gòu)。它支持兩種操作:合并(Union)和查詢(Find)。 合并操作將兩個(gè)不相交的集合合并為一個(gè)集合,查詢操作用于判斷兩個(gè)元素是否屬于同一個(gè)集合。 本文將介紹并查集算法的實(shí)現(xiàn),并給出一個(gè)

    2024年01月25日
    瀏覽(20)
  • Peter算法小課堂—并查集

    Peter算法小課堂—并查集

    我們先來看太戈編程467題 攀親戚 題目描述: 最近你發(fā)現(xiàn)自己和古代一個(gè)皇帝長(zhǎng)得很像:都有兩個(gè)鼻子一個(gè)眼睛,你想知道這皇帝是不是你的遠(yuǎn)方親戚,你是不是皇親國(guó)戚。目前你能掌握的信息有m條,關(guān)于n個(gè)人:第i條信息包含兩個(gè)人的編號(hào)ai,bi,表示ai和bi是親戚。你的編號(hào)

    2024年01月18日
    瀏覽(19)
  • 【數(shù)據(jù)結(jié)構(gòu)與算法】并查集

    【數(shù)據(jù)結(jié)構(gòu)與算法】并查集

    并查集是一個(gè)樹形結(jié)構(gòu),所謂的并查,就是 當(dāng)我們有了一個(gè)節(jié)點(diǎn),我們就能知道這個(gè)節(jié)點(diǎn)屬于哪個(gè)集合 。 舉個(gè)例子理解以下:戰(zhàn)國(guó)時(shí)期有很多國(guó)家,它們會(huì)互相打仗,那么現(xiàn)在有兩個(gè)互相不認(rèn)識(shí)的人,如何知道對(duì)方是敵是友呢? 現(xiàn)在有一種方法:每個(gè)國(guó)家都有一個(gè)大王,我

    2023年04月15日
    瀏覽(20)
  • 并查集模板的應(yīng)用:連通塊

    并查集模板的應(yīng)用:連通塊

    837. 連通塊中點(diǎn)的數(shù)量 給定一個(gè)包含?nn?個(gè)點(diǎn)(編號(hào)為?1~n1~n)的 無向圖 , 初始時(shí)圖中沒有邊 。 現(xiàn)在要進(jìn)行?mm?個(gè)操作,操作共有三種: C a b ,在點(diǎn)?aa?和點(diǎn)?bb?之間連一條邊,aa?和?bb?可能相等; Q1 a b ,詢問點(diǎn)?aa?和點(diǎn)?bb?是否在同一個(gè)連通塊中,aa?和?bb?可能相

    2024年02月14日
    瀏覽(23)
  • 【數(shù)據(jù)結(jié)構(gòu)】并查集的簡(jiǎn)單實(shí)現(xiàn),合并,查找(C++)

    【數(shù)據(jù)結(jié)構(gòu)】并查集的簡(jiǎn)單實(shí)現(xiàn),合并,查找(C++)

    需要將n個(gè)不同的元素 劃分成一些不相交的集合 。開始時(shí),每個(gè)元素自成一個(gè)單元素集合,然后按一定的規(guī)律將歸于同一組元素的集合合并。在此過程中要反復(fù)用到查詢某一個(gè)元素歸屬于那個(gè)集合的運(yùn)算。適合于描述這類問題的抽象數(shù)據(jù)類型稱為并查集(union-find set)。 學(xué)生小

    2024年02月04日
    瀏覽(15)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包