- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
题目分析 本题是使用“差分约束系统”解决的。题目让我们对一系列形如Ti-Tj=B的不等式求出一组可行解。如果将Ti-Tj=B变形可得Ti=Tj+B,他让我们联想到了一个东西,那就是松弛操作。我们可以将其转化成一个最短路问题,对于不等式Ti=Tj+B,我们加入一条从j到i的长度为B的路径。然后再加入一个结点S,并从S向所有结点连一条长度为0的边。最后以S为源点做一遍SPFA。无解的情况就是没有最短路的情况,就是有负权环的情况,就是某个结点入队超过n次的情况。 拓扑排序 在日常生活中,一项大的工程可以看做是由若干个子工程组成的集合,这些子工程之间必定存在一些先后关系即某些子工程必须在其他一些子工程完成之后才能开始,我们可以用有向图来形象地表示这些子工程的先后关系,子工程为顶点,子工程之间的先后关系为有向边,这种有向图为“顶点活动网络”,又称“AOV”网。一个AOV网应该是一个有向无环图,即不应该带有回路,否则必定会有一些活动互相牵制,造成环中的活动都无法进行。把不带回路的AOV网 中的所有活动排成一个线性序列,使得每个活动的所有前驱活动都排在该活动的前面,这个过程称为“拓扑排序”,所得到的活动序列称为“拓扑序列”。 拓扑排序 其实,构造拓扑序列的拓扑排序算法思想很简单:只要选择一个入度为0的顶点并输出,然后从AOV网中删除此顶点及以此顶点为起点的所有关联边;重复上述两步,直到不存在入度为0的顶点为止。若输出的顶点数小于AOV网中的顶点数,则输出“有回路信息”,否则输出的顶点序列就是一种拓扑序列。这个过程可以用一个宽搜来实现,效率高,而且不会爆栈。 强连通分量 强连通分量的概念刚才已经讲了,求有向图强连通分量的算法有如下两种: Kosaraju算法 Tarjan算法 第一种算法思路简单,但代码量较大,写起来繁琐;第二种算法思路有些复杂,但代码量较小,写起来简洁。 强连通分量 Kosaraju算法 先对原图G做一次拓扑排序,再求出图G的反图Gt,所谓的反图,就是将原图中的边反向得到的图。然后按照拓扑排序的顺序对反图进行搜索,得到若干个搜索树。这样的每个搜索树就是一个强连通分量。算法证明略。 强连通分量 Tarjan算法 这个算法包含动态规划的思想。我们先对整个图进行深度优先搜索,设数组d[i]表示顶点i的发现时间,数组lowbit[i]表示i以及i的后代所能追溯到的最早发现的祖先的发现时间。那么有 lowbit[i]=min d[i] d[u],u是i的祖先,且存在从i到u的边。 lowbit[v],存在一条边从u到v。 强连通分量 Tarjan算法 我们可以在搜索的过程中完成上述动态规划,并增设一个栈数组来保存我们的搜索树。当我们访问完一个点i时,如果lowbit[i]d[i],那么我们就认为它在一个强连通分量里,就顺着栈数组进行查找,直到有一个点k满足lowbit[k]=d[k]。此时从k到i之间的搜索树所包含的顶点一定是一个强连通分量。 欧拉路 相信大家都玩过“一笔画”游戏。所谓的一笔画,就是讲一个图一笔画出,并保证经过所有的边且每条边只经过一次。在无孤立结点的图G中,若存在一条路,经过图中每条边一次且仅一次,则称此路为欧拉路。若这条路的起点与终点重合,则称此路为欧拉回路。存在欧拉回路的图称为欧拉图。 欧拉路 定理1 存在欧拉路的条件:图是连通的,且存在0个或2个奇点。 定理2 存在欧拉回路的条件:图是连通的,且存在0个奇点。 欧拉路 一个经典算法框架: find_circuit(结点i) 当结点i有邻居时 {选择任意一个邻居j; 删除边(i,j); find_circuit(结点j); } top:=top+1; circuit[top]:=结点i; 如果寻找欧拉回路,对任意一个点执行find_circuit,如果是寻找欧拉路经,对一个奇点执行find_circuit。 * 图 山东聊城第一中学 张凯 图的定义 简单讲,一个图是由一些点和这些点之间的连线构成的。严格意义讲,图是一种数据结构,定义为:graph=(V,E),V是点(称为“顶点”)的非空有限集合,E是线(称为“边”)的集合,边一般用(Vx,Vy)表示,其中Vx,Vy属于V。 无向图和有向图 如果边是没有方向的,称此图为“无向图”,如果边是有方向(带箭头)的,则称此图为“有向图”。有向图中的边又称为弧,起点称为弧头,终点称为弧尾。 带权图 一个图中的两顶点不仅是关联的,而且在边上还标明了数量关系,边上带有权的图称为带
文档评论(0)