PASCAL并查集.ppt

  1. 1、本文档共76页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
并查集的时间复杂度 其中α(n)是Ackermann函数的某个反函数,增长速度及其缓慢。 α(n)=4。所以并查集的单次查找操作的时间复杂度也几乎是常数级的。 算法分析: 搜索可以实现(dfs,bfs) 并查集实现 0234500067 1034560500 2045600671 0000000089 dx:array[1..4]of integer=(1,0,-1,0); dy:array[1..4]of integer=(0,1,0,-1); //逐行逐列扫描: ans:=0; for i:=1 to n do for j:=1 to m do if b[i,j] then begin inc(ans); try(i,j); end; procedure try(i,j:integer);//dfs var k:integer; begin b[i,j]:=false;//访问标记 for k:=1 to 4 do if b[i+dx[k],j+dy[k]] then try(i+dx[k],j+dy[k]); end; A(i,j) B(i,j-1) C(i-1,j) ◆ 逐行扫描,依次处理每一个点 ◆ 初始化:每个点的父亲指向本身 //每个数是独立的一个细胞 ◆ 处理点A(I,j): 3种情况如下: ◆ 如果B和C都是细胞:合并 P=find(c); q=find(b); If pq then father[p]=q father[A]=q; ◆ 如果B是而C不是,则 father[A]=B 或father[A]=find(B) ◆ 如果B不是而C是,则 father[A]=C 或father[A]=find(C) ◆ 统计父亲是自身(find(i)=i)的结点数即细胞的个数 const maxn=3000; type point=record x,y:integer; //行与列 end; a:array[1..maxn,1..maxn]of point; //父亲结点 b:array[0..maxn,0..maxn]of boolean; //是否是细胞 算法的实现: //数据读入 readln(n,m); for i:=1 to n do begin for j:=1 to m do begin read(ch); b[i,j]:=ch0; if b[i,j] then begin a[i,j].x:=i; a[i,j].y:=j; end; // 初始化父亲指向自身 end; readln; end; for i:=1 to n do for j:=1 to m do if b[i,j] then begin if b[i-1,j] and b[i,j-1] then //左与上是细胞 begin p:=find(i-1,j); q:=find(i,j-1); if (p.xq.x)or(p.yq.y) then a[p.x,p.y]:=q; a[i,j]:=q; end; if b[i-1,j]and not b[i,j-1] then //上是左不是 begin a[i,j].x:=i-1;a[i,j].y:=j; end; if b[i,j-1] and not b[i-1,j] then //上不是左是 begin a[i,j].x:=i;a[i,j].y:=j-1; end; end; 逐行扫描处理每个细胞结点 function find(x0,y0:longint):point; //查找当前位置(x0,y0)细胞的父亲结点 begin if (x0=a[x0,y0].x) and (y0=a[x0,y0].y) then exit(a[x0,y0]); find:

文档评论(0)

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

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

1亿VIP精品文档

相关文档