- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
例1、codevs1021 玛丽卡 题目大意:图中某条路不可走,求最短路 分析:因为不知道到底那条路不可走,那么我们可以先不考虑不可走的路求一次最短路,然后依次删除求出这条最短路上的一条边,再求最短路,更新最大值。(思考:为什么不删除其他边?) 代码演示: floyd 动态规划原理 设d(i,j)为从i到j的只以(1…k)集合中的节点为中间点的最短路的长度; 1、若经过k,d(i,j)=d(i,k)+d(k,j) 2、若不经过k,d(i,j)=d(i,j) 则d(i,j)=min(d(i,k)+d(k,j), d(i,j)) 伪代码 初始时,d[i][i]=0,其他d值为inf 三种最短路算法 1、dijkstra(单源点最短路):贪心的思想,每次从集合U中找一个离源点最近的点加入到集合S中,并以新加入的点作为中间点松弛U中的点到源点的距离。直到U为空算法结束。 使用优先队列优化。队列中存储的是U中点的子集。 不能处理负权存在的情况。 复杂度小于O(M*N),因为贪心所以速度三者中最快。 2、Bellman-Ford (单源点最短路):对所有边,进行k遍松弛操作,就会计算出与源点最多由k条边相连的点的最短路。因为最短路一定不含环,所以最多包含n-1条边,那么我们进行n-1遍松弛操作就可以计算出所以点的最短路。 每次计算时,那些已经算出来最短路的点不用重复计算,可使用队列优化(SPFA)。 可含负边权。 复杂度为小于O(M*N) 3、Floyd(多源点最短路):点i到j的最短路有两种情况,1:i直接到j,2:i经过k到j,所以对于每个中间点k,枚举它的起点和终点,进行松弛操作,最终将得到所有点的最短路。 邻接矩阵存储,可含负边权。 复杂度O(N^3), 例2 vijos1119Car的旅行路线 rq216 Car的旅行路线:本题关键在于求第四个点和构图 1、首先判断直角的位置: 因为从测试数据文件中读入的三个点的坐标是无序的,因此需判断直角的位置,然后在计算第四个点的坐标。如图,对于线段L1、L2,如果(x1-x2)*(x3-x2)+(y1-y2)*(y3-y2)=0,那么L1 ⊥ L2。 2 计算(x4,y4): 如图:由x4-x3=x1-x2得x4=x1-x2+x3,同样的y4=y1-y2+y3 3、用邻接矩阵把各个(机场)点之间的连接关系表示出来。 4、计算各条高速铁路的长度l,并求出每个城市中每条高速铁路的总价:Ti * l 5、计算各条飞机航线的长度l,并求出每条航线的总价:t * l 用Floyd计算各点间的最短路径,求出费用最少的路线。 最小生成树 设有图G(V,E),w(u,v)表示边(u,v)的权。 生成树是G的极小连通子图,它包含原图的n个点和n-1条边,且是连通的。 若存在树T,使得边权之和W(T)最小,则T为最小生成树。 最小生成树的应用 要在n个城市之间铺设光缆,主要目标是要使这 n 个城市的任意两个之间都可以通信,但铺设光缆的费用很高,且各个城市之间铺设光缆的费用不同;另一个目标是要使铺设光缆的总费用最低。 Kruskal算法:贪心策略,不断加边 Prim算法:贪心策略,不断加点 Kruskal算法 先构造一个只含 n 个顶点,而边集为空的子图,之后,从网的边集 E 中选取一条权值最小的边,若该条边的两个顶点分属不同的树,则将其加入子图,也就是说,将这两个顶点分别所在的两棵树合成一棵树;反之,若该条边的两个顶点已落在同一棵树上,则不可取,而应该取下一条权值最小的边再试之。依次类推,直至森林中只有一棵树,也即子图中含有 n-1条边为止。 /view/247951.htm 伪代码 该算法中关键在于解决判断u,v是否在同一集合和将其合并的操作,这里我们使用一种简单高效的方法:并查集。 并查集 并查集是一种树型的数据结构,用于处理一些点所在集合的合并及查询问题。常常在使用中以森林来表示。 算法步骤 初始化:把每个点所在集合初始化为其自身。 查找:查找元素所在的集合,即根节点。 合并:将两个元素所在的集合合并为一个集合。合并之前,应先判断两个元素是否属于同一集合,这可用上面的“查找”操作实现。 并查集 void chushi(){//初始化 for(int i=0;in;i++)father[i]=i; } int find(int x){//查找 if(father[x]==x)return x; return father[x]=find(father[x]); }//路径压缩 9 10 8 12 20 21 16 4 6 11 1 6 4 11 1 10 12 9 8 20 21 16 并查集 void unionset(int x,int y)//合并 { int
文档评论(0)