PASCAL并查集讲解.ppt

  1. 1、本文档共76页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 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)

shuwkb + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档