贪心算法和分支限界法解决单源最短路径.doc
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《贪心算法和分支限界法解决单源最短路径.doc》由会员分享,可在线阅读,更多相关《贪心算法和分支限界法解决单源最短路径.doc(39页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、Four short words sum up what has lifted most successful individuals above the crowd: a little bit more.-author-date贪心算法和分支限界法解决单源最短路径贪心算法和分支限界法解决单源最短路径单源最短路径计科1班 朱润华 2012040732方法1:贪心算法一、 贪心算法解决单源最短路径问题描述:单源最短路径描述:给定带权有向图G=(V,E),其中每条边的权是非负实数。另外,还给定V中的一个顶点,称之为源(origin)。现在要计算从源到其他各顶点的最短路径的长度。这里的路径长度指的是
2、到达路径各边权值之和。Dijkstra算法是解决单源最短路径问题的贪心算法。Dijkstra算法的基本思想是:设置顶点集合S并不断地做贪心选择来扩充集合。一个顶点属于集合S当且仅当从源点到该顶点的最短路径长度已知。贪心扩充就是不断在集合S中添加新的元素(顶点)。初始时,集合S中仅含有源(origin)一个元素。设curr是G的某个顶点,把从源到curr且中间只经过集合S中顶点的路称之为从源到顶点curr的特殊路径,并且使用数组distance记录当前每个顶点所对应的最短路径的长度。Dijkstra算法每次从图G中的(V-S)的集合中选取具有最短路径的顶点curr,并将curr加入到集合S中,同
3、时对数组distance进行必要的修改。一旦S包含了所有的V中元素,distance数组就记录了从源(origin)到其他顶点的最短路径长度。二、 贪心算法思想步骤:Dijkstra算法可描述如下,其中输入带权有向图是G=(V,E),V=1,2,,n,顶点v是源。c是一个二维数组,cij表示边(i,j)的权。当(i,j)不属于E时,cij是一个大数。disti表示当前从源到顶点i的最短特殊路径长度。在Dijkstra算法中做贪心选择时,实际上是考虑当S添加u之后,可能出现一条到顶点的新的特殊路,如果这条新特殊路是先经过老的S到达顶点u,然后从u经过一条边直接到达顶点i,则这种路的最短长度是di
4、stu+cui。如果distu+cuidisti,则需要更新disti的值。步骤如下: 1、用带权的邻接矩阵c来表示带权有向图, cij表示弧上的权值。设S为已知最短路径的终点的集合,它的初始状态为空集。从源点v经过S到图上其余各点vi的当前最短路径长度的初值为:disti=cvi, vi属于V; 2、选择vu, 使得distu=Mindisti | vi属于V-S,vj就是长度最短的最短路径的终点。令S=S U u;3、修改从v到集合V-S上任一顶点vi的当前最短路径长度:如果 distu+cuj distj 则修改 distj= distu+cuj; 4、重复操作(2),(3)共n-1次。
5、三、 算法实现代码:#include #include #include #include using namespace std; const int N = 5;const int M = 1000;ifstream fin(4d5.txt); templatevoid Dijkstra(int n,int v,Type dist,int prev,Type cN+1); void Traceback(int v,int i,int prev);/输出最短路径 v源点,i终点 int main() int v = 1;/源点为1 int distN+1,prevN+1,cN+1N+1; c
6、out有向图权的矩阵为:endl; for(int i=1; i=N; i+) for(int j=1; jcij; coutcij ; coutendl; Dijkstra(N,v,dist,prev,c); for(int i=2; i=N; i+) cout源点1到点i的最短路径长度为:disti,其路径为; Traceback(1,i,prev); coutendl; return 0; template void Dijkstra(int n,int v,Type dist,int prev,Type cN+1) bool sN+1; for(int i=1; i=n; i+) di
7、sti = cvi;/disti表示当前从源到顶点i的最短特殊路径长度 si = false; if(disti = M) previ = 0;/记录从源到顶点i的最短路径i的前一个顶点 else previ = v; distv = 0; sv = true; for(int i=1; in; i+) int temp = M; int u = v;/上一顶点 /取出V-S中具有最短特殊路径长度的顶点u for(int j=1; j=n; j+) if(!sj) & (distjtemp) u = j temp = distj; su = true; /根据作出的贪心选择更新Dist值 fo
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 贪心 算法 分支 限界 解决 单源最短 路径
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内