1. 程式人生 > >學習筆記——並查集

學習筆記——並查集

要死 這個並查集我學了至少3遍 這應該是我的第四遍了

關於演算法原理有一個非常精彩的拿武林江湖做比喻的部落格寫的非常nice 我這也不多贅述 就寫一點自己的理解

其實這個演算法真的不是難的 基本道理就是找一串數字的頭在哪裡(學習筆記自己懂就好= =)我學的好像就是最基礎的(然而忘了一遍又一遍)

兩個簡單的函式

void unionn(int u, int v)
{
	int a = find(u);
	int b = find(v);
	if (a != b)
	{
		f[a] = b;
	}
}

這個函式是並 定義a b 存放u v的源頭 如果 a b不同源 就讓a作為b的源頭 然後再查b為源的過程中 就會逐漸把以b為源的數字的源頭改為a 就f[n]=a 這種感覺……

int find(int s)
{
	if (s != f[s])
		f[s] = find(f[s]);
	return f[s];
}

這個函式是查 s!=f[s] 意思就是s另有其他的源頭 然後查f[s]的源頭在哪 一直到最終s==f[s] 然後 返回的是f[s] 也就是作為源頭的s 然後 其他的f[n]都會變成s

所以其實他在邊賦值邊遞迴

為什麼這個遞迴會比dfs還難理解啦……