1.想要求一篇关于最短路径研究的一段英文文献(附中文翻译)
迪杰斯特拉算法是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算法。是从一个顶点到其余各顶点的最短路径算法,解决的是有向图中最短路径问题。迪杰斯特拉算法主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。
Dijkstra algorithm is made by Holland computer scientist Dijkstra in 1959, so it is called Stella Dick algorithm. The shortest path algorithm from one vertex to the rest of the vertices is the shortest path problem in the directed graph.. Dijkstra algorithm is characterized by the starting point as the center of the expansion of the center, until the end of the extension.
2.GIS二次开发中怎样实现最短路径分析
这个具体看你用的是那个平台了,一般的平台都会提供相应的模型或者接口啊之类的,只需准备符合条件的数据然后调用即可实现,比如说超图里SuperMap Objects 根据查找结果的需求不同,提供了三种接口来实现最佳路径分析:1、Path:查找经过一系列有序站点的最佳路径,结果返回一个路由对象 soGeoLineM。行驶导引通过 GetPathTable 接口导出。2、PathEx:查找经过一系列有序站点的最佳路径,结果返回一个路由对象soGeoLineM,同时会返回路径通过的结点和弧段的标识ID(即在网络分析环境中设置的ID字段,不一定是SmID)。行驶导引通过 GetPathTable 接口导出。PathEx2:查找经过一系列有序站点的最佳路径。结果提供 PathTable 行驶导引表,该表记录了结果路由需要经历的结点和弧段名称,以及在每个结点和弧段上的转向信息,具体花费。新方法提高了分析效率,对返回结果可灵活设置(通过 soPathResultSetting 和 soPathResultInfo )。
具体的实现一般的帮助文档里会有实例演示,不知道这样回答满意不。
3.最短路径算法在交通中的运用
这是以前写的!!无论是有向图还是无向图都可以处理!!用的是Dijkstra算法/*求最短路径*/#include<stdio.h>#include<stdlib.h>typedef int Status;typedef Status ** Node;#define MaxNum 10000;#define FALSE 0;#define TRUE 1;/*建一个带权的邻接矩阵来存放有向图*/Node Build (Status num , Status num2 ){ int i,j,k,h; Node a; a=(Node) malloc( num * sizeof (Status *)); printf("请输入图的相关信息,如0 2 10表示弧是从顶点v0走向顶点v2,且权为10\n"); printf("(每输入一个信息再按一次Enter)\n(在这里顶点是从v0算起,当然这并不是表示要从v0出发找最短路径\n"); printf("当然也可以从其他点出发找最短路径):\n"); for(i=0;i<num;i++) { a[i]=(Status *) malloc( num * sizeof (Status)); for(j=0;j<num;j++) { a[i][j]=MaxNum; } } for(h=0;h<num2;h++) { scanf("%d %d %d",&i,&j,&k); /*防止输入过界*/ if( i>=num || j>=num ) { printf("无效的输入!请重新输入!!"); exit(1); } a[i][j]=k; } return a;}/*迪杰斯特拉算法求最短路径*/void ShortestPath_DIJ( Node a ,Status i ,Status v0 ,Status *D ,Status *pre ){ int v,w,j,l=1; Status *final;/*final[v]为TRUE表示已经求得最短路径*/ Status min; final=(Status *)malloc( sizeof(Status)*i ); for(v=0;v<i;v++) { final[v]=FALSE;/*设空路径*/ pre[v]=FALSE; D[v]=a[v0][v]; if(D[v]<10000) pre[v]=v0; }//for /*选择的顶点没有出度时,为了防止下面的算法出现越界,直接输出,不再进行下步动作*/ for(v=0;v<i;v++) { if( a[v0][v]==10000 ) l++; } if(l>i) { printf("\n从v%d出发没有最短路径到其他端点!\n",v0); exit(0); } D[v0]=0; final[v0]=TRUE;//初始化,v0顶点确定 for( j=0 ; j<i ; ++j ) { /*找出距离顶点最近的顶点*/ min=MaxNum; for( w=0 ; w<i ; w++) { if( !final[w] )//w顶点还没确定 { if( D[w]<min ) { v=w;min=D[w];/*w顶点离v0更近*/ //printf("wozaizhe"); } } } final[v]=TRUE; /*更新当前最短路径及距离*/ for( w=0 ; w<i ; w++ ) { if( !final[w] && ( (min+a[v][w])<D[w]) ) { D[w]=min+a[v][w]; pre[w]=v; }//if } }//for}//ShortestPath_DIJvoid Show(Status *D , Status *pre ,int i ,int v0){ int j,k,m,n; int *temp; temp=(int *)malloc(sizeof(int)*i); for(j=0;j<i;j++) { printf("\nv%d路径长度为:%d " ,j,D[j]); n=j; if(D[j]!=10000) for(k=0;k<i;k++) { temp[k]=pre[n]; if(temp[k]!=v0) n=temp[k]; if(temp[k]==v0) break; } if( k==0&&D[j]!=10000&&D[j]!=0 ) { printf("v%d->v%d",v0,j); } if( k!=0 &&D[j]!=10000&&D[j]!=0) { for(m=k;m>=0;m--) { printf("v%d->",temp[m]); } printf("v%d",j); } if(D[j]==10000) { printf("从v%d出发没有最短路径!",v0); } if(D[j]==0) { printf("v%d",v0); } } printf("\n");}main(){ int i,j,v0; Node a; Status *D,*pre; printf("请输入有向图的顶点数!"); scanf("%d",&i); printf("再输入有向图的有效弧数!"); scanf("%d",&j); D=(Status *)malloc(sizeof(Status)*i); pre=(Status *)malloc(sizeof(Status)*i); a=Build(i,j); printf("请输入起始顶点(可以是范围内的任何顶点): ",j); scanf("%d",&v0); if(v0>i) { printf("输入错误!不存在这样的起始点!"); exit(1); } ShortestPath_DIJ( a ,i ,v0 ,D , pre ); Show( D, pre, i, v0 );}。