- 1、本文档共55页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
图基本算法
题目分析:此题题意是判断有向图中是否存在负权回路,怎样构造图呢?对于双向路径(u,v),可以构造成两条边(u,v,t)和(v,u,t),对于虫洞单向路径(u,v),可以构造一条边(u,v,-t),这样运行bellman-ford算法就可以判断出是否存在负权回路。 代码附后 Dijkstra算法 Dijkstra算法解决了有向图G=(V,E)上带权的单源最短路径问题,但要求所有边的权值非负。Djikstra算法中设置了一顶点集合S,从源点s到集合中的顶点的最终最短路径的权值均已确定,算法反复选择具有最短路径估计的顶点u∈V-S,并将u加入S中,对u的所有出边进行松弛。 算法执行过程 int dijkstra(int s,int n) { int i,j; int v[MAX]; int d[MAX]; for(i=1;i=n;i++) d[i]=map[1][i]; v[1]=1; for(i=1;in;i++) { int now,min=INT_MAX; for(j=1;j=n;j++) //选最小的加入集合 { if(!v[j]mind[j]) { min=d[j]; now=j; } } v[now]=1; for(j=1;j=n;j++) //松弛 if(!v[j]d[now]+map[now][j]d[j]) d[j]=d[now]+map[now][j]; } return 0; } 依然是O(n^2)的算法,依然可以用堆优化到O(elogv+vlogv) spfa算法 Shortest?path?faster?algorithm SPFA 其实就是Bellman-Ford的一种队列实现,减少了冗余,即松驰的边至少不会以一个d为∞的点为起点。 算法: 1.队列Q={s} 2.取出队头u,枚举所有的u的临边 .若d(v)d(u)+w(u,v)则改进 ,pre(v)=u,由于d(v)减少了,v可能在以后改进其他的点,所以若v不在Q中,则将v入队。 3.一直迭代2,直到队列Q为空(正常结束),或有的点的入队次数=n(含有负圈)。 一般用于找负圈(效率高于Bellman-Ford),稀疏图的最短路 由于点可能多次入队,但队列中同时不会超过n个点。所以用一个长度为n的循环队列来实现这个队。 SPFA在形式上和宽度优先搜索非常类似,不同的是宽度优先搜索中一个点出了队列就不可能重新进入队列,但是SPFA中一个点可能在出队列之后再次被放入队列,也就是一个点改进过其它的点之后,过了一段时间可能本身被改进,于是再次用来改进其它的点,这样反复迭代下去。设一个点用来作为迭代点对其它点进行改进的平均次数为k,有办法证明对于通常的(不含负圈,较稀疏)情况,k在2左右。算法复杂度理论上同Bellman-Ford,O(nm),但实际上却是O(km)。 例题:看晴子大牛的体型 知道他一定又馋又懒,他有n-1个小弟,每天都让他的n-1个小弟去n-1个不同的饭馆给他买回山珍海味,已知饭馆之间是以有向图连接起来的,我们可以保证每两个饭馆之间可以互相可达,问他的小弟帮他买回饭来总共走的最短路程是多少(假设晴子大牛所在顶点为点1,饭馆为2~n)?n=m=1000000 由于数据范围很大,Dijkstra算法和Bellman-Ford超时,我们可以用spfa算法求得由点1到其他点的距离,那么怎么求从其他点到点1的距离呢? 我们可以把每条有向边反向,这样再用spfa在反向的图中求一次源点到其他的点的距离就求出了从每个点到源点的距离。 代码附后 单源最短路问题小结 Dijkstra算法的效率高,但是也有局限性,就是对于含负权的图无能为力。 Bellman-Ford算法对于所有最短路长存在的图都适用,但是效率常常不尽人意。 SPFA算法可以说是综合了上述两者的优点。它的效率同样很不错,而且对于最短路长存在的图都适用,无论是否存在负权。它的编程复杂度也很低,是性价比极高的算法。 对于绝大多数最短路问题,我们只需套用经典算法就行了。所以往往我们的难点是在模型的建立上。 每对顶点的最短路径floyd-washall算法的基本思想 递推产生矩阵序列f(0), f(1), …, f(n)。 其中f(0)[i,j]=map[i,j] f(k)[i,j]的值表示从vi到vj,中间结点编号不超过k的最短路径长度。 f(n)[i,j]的值就是从vi到vj的最短路径长度。 递推过程----动态规划 如果f(k)[i,j]中间节点编号经过k,则f(k)[i,j]=f(k-1)[i,k]+f(k-1)[k,j]。如果f(k)[i,j]中间节点不
您可能关注的文档
- 四章节绿色植物是生物圈中有机物制造者.ppt
- 四章节细胞因子.ppt
- 四章节资本积累.ppt
- 四章节谷氨酸生产菌主要特征、育种及其扩大培养.ppt
- 四章节软件策划.ppt
- 四章节轨道结构.ppt
- 四章节词汇.ppt
- 四章节集成运放内部电路设计.ppt
- 四章节资本成本和资本结构.ppt
- 四章节齿轮机构及其设计.ppt
- 2025至2030中国壳聚糖凝胶行业运营态势与投资前景调查研究报告.docx
- 2025至2030中国射频可变衰减器行业项目调研及市场前景预测评估报告.docx
- 2025至2030中国组合机床行业发展趋势分析与未来投资战略咨询研究报告.docx
- 2025至2030中国手游行业项目调研及市场前景预测评估报告.docx
- 2025至2030麻醉药行业投资机会及风险投资运作模式报告.docx
- 2025至2030中国电气隔离开关行业市场占有率及投资前景评估规划报告.docx
- 2025至2030中国精对苯二甲酸行业发展趋势与产业运行态势及投资规划深度研究报告.docx
- 2025至2030全球及中国工业机器人供电系统行业产业运行态势及投资规划深度研究报告.docx
- 2025至2030中国异氟烷行业产业运行态势及投资规划深度研究报告.docx
- 2025至2030耐高温涂料行业风险投资态势及投融资策略指引报告.docx
文档评论(0)