dijsktra求所有点的最短路径 超急T T 先谢谢大神们了!!!

Dee1997 2017-07-07 09:25:46
给定了一些点的信息和路点的信息,包括经纬度/长度/是否单行

用而维数组存节点到所有节点的最短路径 dist[][]
当我查询某一个节点到所有节点的最短路径是成功了 比如dist[0][]

但是当我遍历下面的节点时 就不行了 路径只能到它连着的边节点.. 不能继续从边节点到边节点遍历

快要交作业了卡在了这一步求大神T T

以下是有用到求最短路径的代码:


int main()
{
for (;pdjbegin<g.getvsize();pdjbegin++)
{

//dijkstra(pg1,pdjbegin,dist,path);

//dijkstra1
double *tempd=new double[MaxvertaxNum];
int *tempp=new int[MaxvertaxNum];
dijkstra1(pg,pdjbegin,tempd,tempp);
for(int i=0;i<g.getvsize();i++)
{
dist[pdjbegin][i]=tempd[i];
path[pdjbegin][i]=tempp[i];
}
delete []tempd;
delete []tempp;
}
return 0;
}



dijkstra算法


void dijkstra1(Grid *G, int u,double d[],int p[] )//图的指针G,源顶点U,每个顶点到源顶点的最短距离的数组d[],每个顶点到源顶点最短路径的父节点编号p[]
{
int i,j,t;
EdgeNode *pnode = new EdgeNode;
//初始化参数
for(i=0;i<G->getvsize();i++)
{
//G->getGraph()->adjlist[i].boolval=false;//可以这样操作?
d[i]=1000000000;//到达所有顶点为无穷大
p[i]=-1;
}


if(!(pnode=G->getGraph()->adjlist[u].firstedge))//确认查询的顶点有边
{
/*printf("%lf",d[u]);*/
/*for(int i=0;i<g.getvsize();i++)
G->getGraph()->adjlist[u].boolval=false;*/
delete pnode;
return;
}
while(pnode)
{
/*for(i=0;i<G->getvsize();i++)
{
if((G->getVertex(i).x-pnode->adjvex.x<0.00000001)&&(G->getVertex(i).y=pnode->adjvex.y<0.00000001)

}*/
d[pnode->subsequnce]=pnode->length;
p[pnode->subsequnce]=u;
//if (pnode->next!=NULL)
//{
// break;
//}
/*pnode->next=new EdgeNode;*/
pnode=pnode->next;
/*pnode->next=NULL;*/


}
G->getGraph()->adjlist[u].boolval=true;
d[u]=0;
for(i=0;i<G->getvsize();i++)
{
int mini=1000000000;
t=u;
for(j=0;j<G->getvsize();j++)
{
if(G->getGraph()->adjlist[j].boolval!=true && mini>d[j])
{
t=j;
mini=d[j];
}
}
if(t==u)
{
for(int i=0;i<g.getvsize();i++)
G->getGraph()->adjlist[u].boolval=false;
delete pnode;
break;
}
G->getGraph()->adjlist[t].boolval=true;
pnode=G->getGraph()->adjlist[t].firstedge;

while(pnode)
{
if(G->getGraph()->adjlist[pnode->subsequnce].boolval!=true && (d[pnode->subsequnce]>(d[t]+pnode->length)))
{
d[pnode->subsequnce]=d[t]+pnode->length;
p[pnode->subsequnce]=t;
}
pnode=pnode->next;
}
}
/*printf("%lf",d[u][0]);*/
for(int i=0;i<g.getvsize();i++)
G->getGraph()->adjlist[u].boolval=false;
delete pnode;
}
...全文
123 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2017-07-10
  • 打赏
  • 举报
回复
代码功能归根结底不是别人帮自己看或讲解或注释出来的;而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒:再牛×的老师也无法代替学生自己领悟和上厕所! 单步调试和设断点调试(VS IDE中编译连接通过以后,按F10或F11键单步执行,按Shift+F11退出当前函数;在某行按F9设断点后按F5执行停在该断点处。)是程序员必须掌握的技能之一。
Dee1997 2017-07-08
  • 打赏
  • 举报
回复
有人吗…………

64,646

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧