求广州地铁 从嘉禾望岗站到杨箕站的最短路径
1:地铁3号线北延段来 → 地铁源1号线
约30分钟 / 15.8公里
嘉禾望岗 9站 乘坐 地铁3号线北延段(体育西路方向), 在 体育西路站 下车
1站 乘坐 地铁1号线(西朗方向), 在 杨箕站 下车
2:地铁2号线 → 地铁5号线
约40分钟 / 17.3公里
嘉禾望岗 8站 乘坐 地铁2号线(广州南站方向), 在 广州火车站 下车
5站 乘坐 地铁5号线(文冲方向), 在 杨箕站 下车
求解:图论中常见的最短路径算法有几种都是什么
主要是有三种、复、
第一种是最制直接的贪心dijkstra算法、、可以利用堆数据结构进行优化、、缺点就是不能求有负权的最短路与判断负环、、
第二种是bellman-ford算法、、根据松弛操作的性质是可以来判断负环的、、时间复杂度是O(nm)的、、
第三种是SPFA算法、、把他单独拿出来作为一种算法并不是非常好的、、他的实质应该是上面的bellman-ford算法的队列优化时间复杂度更低、O(KE)、K的值约等于2、、
求最短路径,图中为地铁路线,如果要用c++表达,应该怎么样写
球最短路径需要数据结构与算法里面的图论的知识。
你这地图的路线图中,任意两点直接只有一条路径,需要求最短路径吗?
求一个无向图中两点间最短路径的算法
|String[] s={"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"};
System.out.print("请输入数字(1-12):版");
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
String str=br.readLine();
int m=Integer.parseInt(str);
if (m<=0||权m>=13)
{
交通咨询系统中的最短路径 建立交通图的存储结构、解决单源最短路径问题、再实现两个地点最短路径问题
交通图应该是带权值的有向图问题。
#include <iostream.h>
#include <iomanip.h>
#include <stdio.h>
#define Maxint 9999
#define Maxn 30 //最大顶点数目
int CostMatrixArr[Maxn][Maxn]; //邻接表
int dist[Maxn]; //最短路径长度
int pre[Maxn]; //最短路径顶点
//Dijkstra方法求最短路径
// n--顶点总数
// k--起始顶点
void Dijkstra(int CostMatrix[][Maxn],int n,int k,int dist[],int pre[])
{
bool s[Maxn];
int i,j,p,min;
for(i=0;i<n;i++)
{ s[i]=false;
pre[i]=k-1;
dist[i]=CostMatrix[k-1][i];
}
s[k-1]=true;pre[k-1]=0;dist[k-1]=0;
for(j=0;j<n-1;j++)
{
min=Maxint;
p=-1;
for(i=0;i<n;i++)
if(!s[i] && dist[i]<min)
{ p=i;min=dist[i];
}
if(p==-1)break;
s[p]=true;
for(i=0;i<n;i++)
if(!s[i] && min+CostMatrix[p][i]<dist[i])
{ dist[i]=min+CostMatrix[p][i];
pre[i]=p;
}
}
}
//显示最短路径:从BeginVertext到EndVertex的顶点列表
void DispPath(int pre[],int BeginVertext,int EndVertex)
{
if(EndVertex!=BeginVertext)
DispPath(pre,BeginVertext,pre[EndVertex-1]+1);
cout<<EndVertex<<' ';
}
//显示创建的邻接表
void DispAdjlink(int CostMatrix[][Maxn],int n)
{
int i,j;
char s[10];
//表头
cout<<"顶点";
for(i=0;i<n;i++)cout<<setw(3)<<i+1;
cout<<endl;
//邻接表
for(i=0;i<n;i++)
{ sprintf(s," V%-2d",i+1);
cout<<s;
for(j=0;j<n;j++)
if(CostMatrixArr[i][j]==Maxint)
cout<<" ∞";
else
cout<<setw(3)<<CostMatrixArr[i][j];
cout<<endl;
}
}
void main()
{
int n=0,V,U,W,x;
for(int i=0;i<Maxn;i++) //初始化邻接表
for(int j=0;j<Maxn;j++)
CostMatrixArr[i][j]=Maxint;
cout<<"顶点编号从1开始。\n================\n";
cout<<"顶点、终点、权值:\n";
do
{
cin>>V>>U>>W;
if(!(V && U && W))break; //若输入的顶点号或权值为0,结束
CostMatrixArr[V-1][U-1]=W; //存入邻接表
n=n>=(V>U?V:U)?n:(V>U?V:U); //n为输入的最大顶点号,即顶点个数
}while(1);
cout<<"顶点数为:"<<n<<endl;
DispAdjlink(CostMatrixArr,n); //显示邻接表
Dijkstra(CostMatrixArr,n,1,dist,pre); //用Dijkstra求最短路径
//从顶点1到最后一个顶点的最短径
cout<<"最短路径:";
DispPath(pre,1,n);
cout<<"\n";
//从顶点1到最后一个顶点的权值
cout<<"权值:"<<dist[n-1]<<endl;
}
Dijkstra算法流程图
建议看下 严蔚敏 的那本《数据结构》,讲的挺明白的
地铁最小换乘和最短路线怎么算
最小换乘是根据数据库的。这个算法很简单就是一个递归函数而已。如这里有地铁站A和B。我们要打A->B的最小换乘。第一步:看A所在的每个路线里是否存在B,如A站有线路a,b,检查线路a,b中是否含B,如果含就取出结果。否则进入第二步。;第二步:对A站所在的所有线路的站点进行第一步那样搜索,如a线路第一站为C,则又找C->B的。 就这样不停的递归就行了。。。
有必要说明的是任何算法都要建立在实际的基础上,如果不符合实际再精妙的算法也是不好的。。换乘的法,一般到两次就行了,,换乘次数多了明显是不符合实际的。。所以你不必写出完整的算法,只需单独写出换乘一次,二次的就行了。。很简单的。。
最短路径,我建议建立“图”吧。让每条边的权重为它的长度,然后用图相关的算法就可以实现了。。
我建议先找到二次以内的换乘方案。然后再计算每一次换乘的距离,最终取出路径最小的方案。。如果用上面哪种方法的话,可以得到最短路径,,但可能要换乘很多次,那样也不符合实际.
我刻我当初在做公交查询时就给每个站点和它们之间的路径建立一个网络,,最终分析这个几何网络得到最短路径..可结果很遗憾,,,最短路径是得到了..可是换乘大多..太不符合实际了...
希望能帮到你~~
最短路径 程序
最短路问题给定 N个点p (i 1, 2, , N) i = L 组成集合{ } i p ,由集合中任
一点i p 到另一点j p 的距离用ij c 表示,如果i p 到j p 没有弧联结,则规定= +¥ ij c ,
又规定c 0(1 i N) ii = £ £ ,指定一个终点N p ,要求从i p 点出发到N p 的最短路线。
这里我们用动态规划方法来做。用所在的点i p 表示状态,决策集合就是除i p 以外的
点,选定一个点j p 以后,得到效益ij c 并转入新状态j p ,当状态是N p 时,过程停
止。显然这是一个不定期多阶段决策过程。
定义 f (i)是由i p 点出发至终点N p 的最短路程,
,用LINGO可以方便的解决。
!最短路问题;
model:
data:
n=10;
enddata
sets:
cities/1..n/: F; !10个城市;
roads(cities,cities)/
1,2 1,3
2,4 2,5 2,6
3,4 3,5 3,6
4,7 4,8
5,7 5,8 5,9
6,8 6,9
7,10
8,10
9,10
/: D, P;
endsets
data:
D=
6 5
3 6 9
7 5 11
9 1
8 7 5
4 10
5
7
9;
enddata
F(n)=0;
@for(cities(i) | i #lt# n:
F(i)=@min(roads(i,j): D(i,j)+F(j));
);
!显然,如果P(i,j)=1,则点i到点n的最短路径的第一步是i --> j,否则就不是。
由此,我们就可方便的确定出最短路径;
@for(roads(i,j):
P(i,j)=@if(F(i) #eq# D(i,j)+F(j),1,0)
);
end
最短路径问题
如图,两种画法,点击放大:

计算地铁任意两站之间的人最短路径代码怎么写。要用数据库的方法读取站点的坐标和权重
[slot].name);printf("Enterstreet:");gets(addr_list[slot].street);printf("Entercity:");gets(addr_list[slot].city);printf("Enterstate:");gets(addr_list[slot].state);printf("Enterzip:");gets(s);addr_list[slot].zip=strtoul(s,'\0',10);}/*Findanunusedstructure.*/intfind_free(void){registerintt;for(t=0;addr_list[t].name[0]&&t=0&&slot

评论列表: