若干图论专题【信息技术】.pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
若干图论专题 清华大学 刘汝佳 内容介绍 拓扑排序 欧拉道路和回路 最小生成树问题 最短路问题 基本概念 图G=(V, E) 点集V 边集E,边(u, v) 权集W,边(u,v)有权w 图形表示 邻接矩阵表示 邻接表表示 前向星表示 拓扑排序 网线从机房连接到办公室 在机房,所有网线从左到右编号为1,2,3,…,N 给出每两条线是否交叉的信息,请计算办公室内从左到右各条线的编号 拓扑排序 核心问题:给一些序关系,排出全序! 一个一个排 先排最大 然后第二大… 具体实现? 每次取0度点 枚举所有点吗? 0度只可能是1度变来的! O(n+m) 欧拉道路和回路 经过每条边一次且仅一次 先看回路 必要条件:所有点度为偶数 充分条件:还是“所有点度为偶数” 证明! 把欧拉回路构造出来 “圈套圈” 可能套不出来吗?想一想 欧拉道路和回路 有向的情形 入度 = 出度 如何套圈? 道路 有两个奇度点 正好是起点和终点 哪个是起点,哪个是终点? 有向+无向怎么办? 网络流!不要求掌握 一个例子 幼儿园里有很多房屋 房屋与房屋之间连以走廊 走廊与房屋之间有一扇门 幼儿园长想把门漆成绿色或者黄色,使得 任意一条走廊两头门的颜色不同 任意一间房屋上的门,绿色门的数量与黄色门的数量相差不超过1。 如何实现? 每个房屋的门都是偶数个… 把奇数改造成偶数! 另一个例子 考古学家发现了一块布,布上做有针线活,叫做“十字绣” 交替地在布的两面穿线 布是一个n×m的网格 线只能在网格的顶点处才能从布的一面穿到另一面。 每一段线都覆盖一个单位网格的两条对角线之一 而在绣的过程中,一针中连续的两段线必须分处布的两面 给出布两面的图案(实线代表有线,虚线代表背面有线) 最少需要几针才能绣出来? 一针是指针不离开布的一次绣花过程。 例如图(b)的图案最少需要4针。 分析 抽象成图 正面的线:正边 背面的线:负边 有边相连:连通块 每个连通块分别求 对于某个顶点I |正边数-负边数|=K 0时 以该顶点为开始或结束的针数 =K 可以恰好为K针 所有K值加起来,除以2(每一针有两个端点) 最小生成树问题 要求连接所有岛屿 电缆总长度尽量小 Prim算法 任意时刻的中间结果都是一棵树 从一个点开始 每次都花最小的代价,用一条加进一个新点 问题: 这样做是对的吗? 如何快速找到这个“最小代价”? Prim算法的正确性 换一种说法 存在一个MST,包含当前所有边 但不包含最小代价边(u, v) 反证法! 假设存在这样的MST 当前结点集为S,剩下的结点集为T 由于在MST中S-T连通 一定有跨越S-T的某边(u’,v’) 它不是最小代价边(u,v) 删除(u’,v’),加入(u,v),S和T分别连通,且S-T通过(u,v)连通 得到了一个更小的MST! 快速找到最小代价 需要借助数据结构! 我们的算法要求 快速取/删除最小值(边权) 允许插入边(加入新点时插入它的关接边) 抽象数据类型:优先队列! 经典实现:堆! 堆是一棵完全二叉树 每个结点有一个权值 根的权值最小 根的左右子树都是堆 堆的操作 插入 插在哪里可以保持完全二叉树的形态呢? 插最后! 怎样维持堆的根最小性质呢? 向上调整(和父亲交换) 删除 怎样保持完全二叉树形态呢? 和最后一个元素交换,再直接删除 怎样维持堆的根最小性质呢? 向下调整(和两个儿子比较,和较小的交换) 时间复杂度:均为O(logn) 还有一个操作:取最小值,怎么实现? 堆的实现 完全二叉树可以用数组heap[1..maxn]实现 结点i的… 父亲:i div 2 左儿子:2*i 右儿子:2*i+1 存在条件:i = nodecount 不用指针! 利用了数组的“随机存取”特性! 插入删除过程 用循环,不要用递归 Prim算法框架 初始化,树仅含一个任意一点v0 把v0的邻边插入堆 for i:=1 to n-1 do begin 从堆中取出最小值,设边为(u’,v’),v’为新点 (u’,v’)加入生成树中 v’和它所有不在树中的邻居组成的边插入堆 end; 每次取最小值为O(logm) 总时间复杂度为O(nlogm) Kruskal算法 任意时刻的中间结果是一个森林 从n个点的集合开始 每次选不产生圈的前提下权最小的边加入 问题: 这样做是对的吗? 如何快速的判断是否产生圈 Kruskal算法的正确性 把一个二元组(E, I)叫做一个子集系统,如果满足: 1.E是一个非空集合 2.I是E的一个子集族,它在包含运算下封闭,即I的每个元素a都是E的一个子集,并对于a的任何子集a’,a’一定也是I的元素。 3.给E中每个元素e赋予一个正权w(e)。 考虑至少有一条边的带权无向连通图G 它的边集为E 它的所有生成森林

文档评论(0)

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

1亿VIP精品文档

相关文档