- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话: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])
                您可能关注的文档
最近下载
- 摩擦学基础知识-磨损.ppt VIP
- 景观规划设计(第3版)课件:滨水景观文化设计.pptx VIP
- 甘肃省兰州市城关区树人学校2022-2023学年八年级上学期期中物理试卷(含答案).docx VIP
- 2018-2019学年甘肃省兰州市树人中学八年级(上)期中物理试卷.docx VIP
- 2020-2021学年甘肃省兰州市城关区树人中学八年级(上)期中物理试卷(含解析).doc VIP
- 十五五规划(2026-2030年)是国家未来五年发展的战略性蓝图。以下关于十五.docx VIP
- 电工基础试卷a卷及答案.doc VIP
- 甘肃省兰州市第三十五中学2022-2023学年八年级上学期期中物理试卷(含答案).docx VIP
- 北京市通州区2024-2025学年七年级上学期期末生物学试题(含答案).pdf VIP
- 北京市通州区2024-2025学年七年级上学期期末考试英语试卷.docx VIP
 原创力文档
原创力文档 
                        

文档评论(0)