图:最短路径
用深度优先搜素,找具体两个顶点的最短路径
void min_path_dfs(Graph *pg,int cur,int end,int curpath,int mark[],int *pminpath,int path[],int cnt,int savepath[],int *savecnt){
if(curpath>*pminpath){//还没到终点,已经走过的路大于当前最小路径
return;
}
if(curend){//到达目标路径
if(curpath<*pminpath){
*pminpath=curpath;
int i;
for(i=0;i<cnt;i++){
savepath[i]=path[i];
}
savepath[i]=cur;
*savecnt=cnt+1;
}
return;
}
mark[cur]=1;//顶点已走过
path[cnt++]=cur;//记录下当前点下标
ENode *node=pg->veryex[cur].enodes;
while(node!=NULL){
int pos=get_position(pg,node->date);
if(mark[pos]0){
min_path_dfs(pg,pos,end,curpath+node->weight,mark,&pminpath,path,cnt,savepath,&savecnt);
}
node=node->next;
}
mark[cur]=0;//路径不正确,原本的顶点复原为0,表示可以重新走
}
int short_path_dfs(Greaph *pg,char skey,char ekey){
//得到两个顶点的下标位置
int spos=get_position(pg,skey);
int epos=get_position(pg,ekey);
if(spos-1||epos-1){//所给的顶点不存在
return -1;
}
int vn=pg->vertexnum;//图中顶点的个数
int mark[vn];//记录顶点是否走过
int minpath=MAX;//(1<<31)
int i;
for(i=0;i<vn;i++){
mark[i]=0;//表示顶点没有走过
}
int path[vn];//记录走过的顶点下标位置
int cnt=0;
int savepath[vn];
int savecnt=0;
min_path_dfs(pg,spos,epos,0,mark,&minpath,path,cnt,savepath,&savecnt);
}
数据结构图:用深度优先搜素,找具体两个顶点的最短路径
最新推荐文章于 2022-12-08 11:27:55 发布