- 1、本文档共76页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
并查集初步及应用;
引例:犯罪团伙
1、最小生成树
2、细胞个数
3、房间问题(noi94)
4、代码等式
5、银河英雄传说(noi2002);引例:【犯罪团伙】
警察抓到了n个罪犯,警察根据经验知道他们属于不同的犯罪团伙,却不能判断有多少个团伙,但通过警察的审讯,知道其中的一些罪犯之间相互认识,已知同一犯罪团伙的成员之间直接或间接认识。有可能一个犯罪团伙只有一个人。
请你根据已知罪犯之间的关系,确定犯罪团伙的数量。已知罪犯的编号从1至n。
输入:
第一行:n(=10000,罪犯数量),
第二行:m(=100000,关系数量)
以下若干行:每行两个数:I 和j,中间一个空格隔开,表示罪犯i和罪犯j相互认识。
输出:一个整数,犯罪团伙的数量。;建立无向图的模型。
?如果x和y认识,结点x和y建立一条无向边。
?求无向图的连通分量(dfs;bfs)
?时间和空间!
邻接矩阵:空间太大,超时。
邻接表:空间满足,时间查过1s;抽象的算法:; 需要将n个不同的元素划分成一组不相交的集合。开始时,每个元素自己成一个单元素集合,然后按照一定的顺序或问题给定的条件和要求将属于同一组元素(有特定关系)所在的集合合并,最后统计集合的个数往往就是问题的解。
在这个过程中要反复的用到查询某个元素属于哪个集合的运算;两个不同集合合并的运算。适合描述这类问题的抽象数据结构类型称为并查集(合并与查找)。;◆并查集是一种树型的数据结构,用于处理一些不相交集合S={S1, S2, …,Sn}, 每个集合Si都有一个特殊元素root[Si],称为集合的代表元.; 并查集的一个重要的应用是确定给定集合上的等价关系的个数。
等价关系是一个具有自反、对称和传递三个性质的关系。
等号“=”在实数集合R上是一个等价关系。
对于实数中的任意x、y、z。一定满足下列关系:
1)、x=x (自反性)
2)、如果x=y,则y=x (对称性)
3)、如果x=y,y=z,则x=z (传递性)
;【犯罪团伙】问题:;并查集的树型结构实现;?Init(X): 集合初始化:
father[xi]=0(或者xi); 每个结点都是一颗独立的树, 是该树的代表元素。;2;树根(???合代表元素):
Father[1]=0; father[8]=0; father[11]=0
孩子结点:
father[2]=1; father[4]=3; father[5]=4; father[9]=8;算法的 实现:;输入:
11
8
1 2
4 5
3 4
1 3
5 6
7 10
5 10
8 9;const max=10000;
var
a:array[1..max]of longint; //父亲指针
i,j,m,n,ans,x,y,p,q:longint;
function find(i:longint):longint;{非递归算法找i的根}
var j,k,t:longint;
begin
j:=i;//顺着结点i开始向上找,直到根为止。
while a[j]0 do j:=a[j];
find:=j;
end;; readln(n);//读入顶点数
readln(m);//读入关系:边
fillchar(a,sizeof(a),0);{默认根标志是0,开始全是树根}
for i:=1 to m do
begin
readln(x,y);
p:=find(x); {查找x的根}
q:=find(y); {查找y的根}
if pq then a[q]:=p; {合并p和q子树}
end;
ans:=0;{树根记数}
for i:=1 to n do
if a[i]=0 then inc(ans);{记录树根结点}
writeln(ans);
end.;function find(i:longint):longint;
//递归算法找i的根
var j,k,t:longint;
begin
if a[i]=0 then exit(i); //若i为根,返回本身结点序号
find:=find(a[i])
文档评论(0)