64,646
社区成员
发帖
与我相关
我的任务
分享
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;
}
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;
}