算法实验三最短路径.docx_第1页
算法实验三最短路径.docx_第2页
算法实验三最短路径.docx_第3页
算法实验三最短路径.docx_第4页
算法实验三最短路径.docx_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

算法分析与设计 实验报告(三)姓名:XXX班级:XXXXX学号:XXXXXXX一、 题目最短路径问题求解二、 基本思想描述1)Dijkstra算法思想为:设G=(V,E)是一个带权有向图,把图中顶点集合V分成两组,第一组为已求出最短路径的顶点集合(用S表示,初始时S中只有一个源点,以后每求得一条最短路径 , 就将 加入到集合S中,直到全部顶点都加入到S中,算法就结束了),第二组为其余未确定最短路径的顶点集合(用U表示),按最短路径长度的递增次序依次把第二组的顶点加入S中。在加入的过程中,总保持从源点v到S中各顶点的最短路径长度不大于从源点v到U中任何顶点的最短路径长度。此外,每个顶点对应一个距离,S中的顶点的距离就是从v到此顶点的最短路径长度,U中的顶点的距离,是从v到此顶点只包括S中的顶点为中间顶点的当前最短路径长度。 Dijkstra算法具体步骤:(1)初始时,S只包含源点,即S,v的距离为0。U包含除v外的其他顶点,U中顶点u距离为边上的权(若v与u有边)或 )(若u不是v的出边邻接点)。(2)从U中选取一个距离v最小的顶点k,把k,加入S中(该选定的距离就是v到k的最短路径长度)。(3)以k为新考虑的中间点,修改U中各顶点的距离;若从源点v到顶点u(u U)的距离(经过顶点k)比原来距离(不经过顶点k)短,则修改顶点u的距离值,修改后的距离值的顶点k的距离加上边上的权。(4)重复步骤(2)和(3)直到所有顶点都包含在S中。 2)Floyd算法的基本思想:可以将问题分解,先找出最短的距离,然后在考虑如何找出对应的行进路线。如何找出最短路径呢,这里还是用到动态规划的知识,对于任何一个城市而言,i到j的最短距离不外乎存在经过i与j之间的k和不经过k两种可能,所以可以令k=1,2,3,.,n(n是城市的数目),在检查d(ij)与d(ik)+d(kj)的值;在此d(ik)与d(kj)分别是目前为止所知道的i到k与k到j的最短距离,因此d(ik)+d(kj)就是i到j经过k的最短距离。所以,若有d(ij)d(ik)+d(kj),就表示从i出发经过k再到j的距离要比原来的i到j距离短,自然把i到j的d(ij)重写为d(ik)+d(kj),每当一个k查完了,d(ij)就是目前的i到j的最短距离。重复这一过程,最后当查完所有的k时,d(ij)里面存放的就是i到j之间的最短距离了。Floyd算法的基本步骤: 定义nn的方阵序列D-1, D0 , Dn1,初始化: D-1C,D-1ij边的长度,表示初始的从i到j的最短路径长度,即它是从i到j的中间不经过其他中间点的最短路径。迭代:设Dk-1已求出,如何得到Dk(0kn-1)?Dk-1ij表示从i到j的中间点不大于k-1的最短路径p:ij,考虑将顶点k加入路径p得到顶点序列q:ikj,若q不是路径,则当前的最短路径仍是上一步结果:Dkij= Dk1ij;否则若q的长度小于p的长度,则用q取代p作为从i到j的最短路径。因为q的两条子路径ik和kj皆是中间点不大于k1的最短路径,所以从i到j中间点不大于k的最短路径长度为:Dkijmin Dk-1ij, Dk-1ik +Dk-1kj 。三、 程序清单Dijkstra1import java.io.*;public class dijkstra4 public static int Dijsktra(int weight,int start) /接受一个有向图的权重矩阵,和一个起点编号start(从0编号,顶点存在数组中) /返回一个int 数组,表示从start到它的最短路径长度 int n = weight.length; /顶点个数 int shortPath = new intn; /存放从start到其他各点的最短路径 String path=new Stringn; /存放从start到其他各点的最短路径的字符串表示 for(int i=0;i+i); int visited = new intn; /标记当前该顶点的最短路径是否已经求出,1表示已求出 /初始化,第一个顶点求出 shortPathstart = 0; visitedstart = 1; for(int count = 1;count = n - 1;count+) /要加入n-1个顶点 int k = -1; /选出一个距离初始顶点start最近的未标记顶点 int dmin = Integer.MAX_VALUE; for(int i = 0;i n;i+) if(visitedi = 0 & weightstarti dmin) dmin = weightstarti; k = i; / System.out.println(k=+k); /将新选出的顶点标记为已求出最短路径,且到start的最短路径就是dmin shortPathk = dmin; visitedk = 1; /以k为中间点,修正从start到未访问各点的距离 for(int i = 0;i n;i+) if(visitedi = 0 & weightstartk + weightki +i; for(int i=0;in;i+) System.out.println(从+start+出发到+i+的最短路径为:+pathi); System.out.println(-); return shortPath; public static void main(String args)throws Exception int W = /邻接矩阵 0,20,15,1000,1000,1000, 2,0,1000,1000,10,30, 1000,4,0,1000,1000,10, 1000,1000,2,0,1000,1000, 1000,1000,1000,15,0,1000, 1000,1000,1000,4,10,0 ; int start=0; int shortPath = Dijsktra(W,start); for(int i = 0;i shortPath.length;i+) System.out.println(从+start+出发到+i+的最短距离为:+shortPathi); File file=new File(E:WorkspaceDijkstradijkstraoutput1.txt); FileWriter out=new FileWriter(file); for(int i=0;ishortPath.length;i+) out.write(shortPathi+t); out.flush(); out.close(); System.out.println(E:WorkspaceDijkstradijkstraoutput1.txt创建成功,请查看); Dijkstra2 import java.io.File;import java.io.FileWriter;public class dijkstra2 public static int Dijsktra(int weight,int start) /接受一个有向图的权重矩阵,和一个起点编号start(从0编号,顶点存在数组中) /返回一个int 数组,表示从start到它的最短路径长度 int n = weight.length; /顶点个数 int shortPath = new intn; /存放从start到其他各点的最短路径 String path=new Stringn; /存放从start到其他各点的最短路径的字符串表示 for(int i=0;i+i); int visited = new intn; /标记当前该顶点的最短路径是否已经求出,1表示已求出 /初始化,第一个顶点求出 shortPathstart = 0; visitedstart = 1; for(int count = 1;count = n - 1;count+) /要加入n-1个顶点 int k = -1; /选出一个距离初始顶点start最近的未标记顶点 int dmin = Integer.MAX_VALUE; for(int i = 0;i n;i+) if(visitedi = 0 & weightstarti dmin) dmin = weightstarti; k = i; / System.out.println(k=+k); /将新选出的顶点标记为已求出最短路径,且到start的最短路径就是dmin shortPathk = dmin; visitedk = 1; /以k为中间点,修正从start到未访问各点的距离 for(int i = 0;i n;i+) if(visitedi = 0 & weightstartk + weightki +i; for(int i=0;in;i+) System.out.println(从+start+出发到+i+的最短路径为:+pathi); System.out.println(-); return shortPath; public static void main(String args)throws Exception int W = /邻接矩阵 0,20,15,1000,1000,1000, 2,0,1000,1000,10,30, 1000,4,0,1000,1000,10, 1000,1000,2,0,1000,1000, 1000,1000,1000,15,0,1000, 1000,1000,1000,4,10,0 ; int start; for(int p=0;pW.length;p+) start=p; int shortPath = Dijsktra(W,start); for(int i = 0;i shortPath.length;i+) System.out.println(从+start+出发到+i+的最短距离为:+shortPathi); System.out.println(-); File file=new File(E:WorkspaceDijkstradijkstraoutput2.txt); FileWriter out=new FileWriter(file); for(int p=0;pW.length;p+) start=p; int shortPath = Dijsktra(W,start); for(int i = 0;i shortPath.length;i+) out.write(shortPathi+t); out.write(n); out.flush(); out.close(); System.out.println(E:WorkspaceDijkstradijkstraoutput2.txt创建成功,请查看); Folydimport java.io.File;import java.io.FileWriter;public class floyd1 public static int Floyd(intw) int k,i,j; for(k=0;kw0.length;k+) for(i=0;iw0.length;i+) for(j=0;jb)return b;else return a; public static void main(String args)throws Exception int W1 = 0, 20, 15, 1000, 1000, 1000 , 2, 0, 1000, 1000, 10, 30 , 1000, 4, 0, 1000, 1000, 10 , 1000, 1000, 2, 0, 1000, 1000 , 1000, 1000, 1000, 15, 0, 1000 , 1000, 1000, 1000, 4, 10, 0 ;/ 建立一个权值矩阵 intdistance=new intW10.lengthW10.length;distance=Floyd(W1);for (int i = 0; i distance.length; i+) for (int j = 0; j distancei.length; j+) System.out.print(distanceij + ); System.out.println(); File file = new File(E:WorkspaceFloydfloydoutput1.txt); /存放数组数据的文件FileWriter out = new FileWriter(file); /文件写入流/将数组中的数据写入到文件中。每行各数据之间TAB间隔for(int i=0;idistance0.length;i+) for(int j=0;jdistance0.length;j+) out.write(distanceij+t); out.write(n); out.flush(); out.close(); System.out.println(E:WorkspaceFloydoutput1.txt创建成功,请查看); 四、 运行的结果 (1)控制台结果从0点出发到其余点的最短路程从任一点出发出发到其余点的最短路程Folyd算法的运行结果

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论