前言:
在游戏开发写某个功能(暂不能透露)的时候没想到要用到以前打算法用的并查集。啊...(此处省略几个字的感慨)。
于是打开了以前刷题的网站把自己之前闭着眼睛都能敲出来的并查集代码找了出来(现在是怎么了,怎么睁着眼睛也写不出来了???)
没啥亮点,就是用了大家常用的路径压缩和按大小合并(按大小比按秩合并和路径压缩更配傲!)
代码:
using System.Collections.Generic;
/// <summary>
/// 并查集
/// </summary>
public class UnionFind
{
private List<int> p;
private List<int> s;
private int count; // 连通的个数
/// <summary>
/// 初始化
/// </summary>
public UnionFind(int a)
{
p = new List<int>();
s = new List<int>();
for (int i = 0; i < a; ++i)
{
p.Add(i);
s.Add(1);
}
count = a;
}
/// <summary>
/// 查找连通根节点
/// </summary>
public int Find(int a)
{
return a == p[a] ? a : p[a] = Find(p[a]);
}
/// <summary>
/// 合并
/// </summary>
public void Union(int a, int b)
{
int pa = Find(a);
int pb = Find(b);
if (pa == pb) return;
if (s[pa] < s[pb])
{
p[pa] = pb;
s[pb] += s[pa];
}
else
{
p[pb] = pa;
s[pa] += s[pb];
}
count--;
}
/// <summary>
/// 返回连通数
/// </summary>
public int Liantong()
{
return count;
}
/// <summary>
/// 连通大小
/// </summary>
public int Size(int a)
{
int pa = Find(a);
return s[pa];
}
};
讲解:
网上讲解博客一大堆!