以邻接表和邻接矩阵做存储结构求最短路径
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
EnQueue(&Q,p->adjvex);//访问过的vk人队
}//endif
p=p->next;//找vi的下一邻接点
}//endwhile
}//endwhile
}//end of shortestpath
dist[p->adjvex]++;
pre[p->adjvex]=i;
visited[P->adjvex]=TRUE;
EnQueue(&Q,p->adjvex);//访问过的vk人队
}//endif
答:
(1)求顶点vi到顶点vj(i<>j)的最短路径
int shortestpath(ALGraph*G,int i,int j)
{// 对邻接表表示的图G,求顶点vi到顶点vj(i<>j)的最短路径
int dist[MaxVertexNum];
}
}//endwhile
}//BFSM
(2)求源点vi到其余各顶点的最短路径
void shortestpath(ALGraph*G,int i)
{// 对邻接表表示的图G,求顶点vi到顶点vj(i<>j)的最短路径
int dist[MaxVertexNum];
int BFSM(MGraph *G,int i,int j)
{// 对邻接链表表示的图G,求顶点vi到顶点vj(i<>j)的最短路径
i Q;
initQueue(&Q);
for(k=0;k<G->n;k++)
}
}//endwhile
for(k=0;k<G->n;k++)// 打印各顶点的最短路径和长度
{printf("path of %c is %d:",G->vertex[k],dist[k]);
j=k;
int dist[MaxVertexNum],k,j;
int pre[MaxVertexNum];//pre[k]中存放vi到vk路径中,vk的前趋的序号
CirQueue Q;
initQueue(&Q);
for(k=0;k<G->n;k++)
p=p->next;//找vi的下一邻接点
}//endwhile
}//endwhile
for(k=0;k<G->n;k++)// 打印各顶点的最短路径和长度
{printf("path of %c is %d:",G->adjlist[k].vertex,dist[k]);
设图中各边的权值都相等,试以邻接矩阵和邻接表为存储结构,分别写出算法:
(1)求顶点vi到顶点vj(i<>j)的最短路径
(2)求源点vi到其余各顶点的最短路径
要求输出路径上的所有顶点(提示:利用BFS遍历的思想)
}
while (j!=i);
printf("\n");
}
}//end of shortestpath
void shortestpathBFSM(MGraph *G,int i)
{// 对邻接矩阵表示的图G,求顶点vi到其他顶点的最短路径
if(G->edges[i][k]==1&&!visited[k]){//vk未访问
dist[k]++;
if (k==j) return dist[j];
visited[k]=TRUE;
EnQueue(&Q,k);//访问过的vk人队
j=k;
printf("%c",G->adjlist[k].vertex);
do
{
j=pre[j];
print("<-%c",G->adjlist[j].vertex);
printf("\n");
}
}//shortestpathBFSM
if(!visited[p->adjvex]){ //若vj未访问过
dist[p->adjvex]++;
if (p->adjvex==j) return dist[p->adjvex];
visited[P->adjvex]=TRUE;
int pre[MaxVertexNum];//pre[k]中存放vi到vk路径中,vk的前趋的序号
CirQueue Q; //须将队列定义中DataType改为int
EdgeNode *p;
int k,j;
for(k=0;k<G->n;k++)
{dist[k]=0; //距离向量初始化
printf("%c",G->vertex[k]);
do
{
j=pre[j];
printf("<-%c",G->vertex[j]);
}
while (j!=i);
{dist[k]=0; //距离向量初始化
pre[k]=k;
}
visited[k]=TRUE;
EnQueue(&Q,i);
while(!QueueEmpty(&Q)){
i=DeQueue(&Q); //vi出队
for(k=0;k<G->n;k++)//依次搜索vi的邻接点vk
CirQueue Q; //须将队列定义中DataType改为int
EdgeNode *p;
int k;
for(k=0;k<G->n;k++)
dist[k]=0; //距离向量初始化
InitQueue(&Q);//队列初始化
visited[i]=TRUE;
dist[i]=0; //距离向量初始化
visited[k]=TRUE;
EnQueue(&Q,i);
while(!QueueEmpty(&Q)){
i=DeQueue(&Q); //vi出队
for(k=0;k<G->n;k++)//依次搜索vi的邻接点vk
if(G->edges[i][k]==1&&!visited[k]){//vk未访问
dist[k]++;
pre[k]=i;
visited[k]=TRUE;
EnQueue(&Q,k);//访问过的vk人队
pre[k]=k;
}
InitQueue(&Q);//队列
初始化
visited[i]=TRUE;
EnQueue(&Q,i);
while(!QueueEmpty(&Q)){//队非空则执行
i=DeQueue(&Q); //相当于vi出队
p=G->adjlist[i].firstedge; //取vi的边表头指针
while(p){//依次搜索vi的邻接点vk(令p->adjvex=k)
if(!visited[p->adjvex]){ //若vj未访问过
EnQueue(&Q,i);
while(!QueueEmpty(&Q)){//队非空则执行
i=DeQueue(&Q); //相当于vi出队
p=G->adjlist[i].firstedge; //取vi的边表头指针
while(p){//依次搜索vi的邻接点vk(令p->adjvex=k)
}//endif
p=p->next;//找vi的下一邻接点
}//endwhile
}//endwhile
}//end of shortestpath
dist[p->adjvex]++;
pre[p->adjvex]=i;
visited[P->adjvex]=TRUE;
EnQueue(&Q,p->adjvex);//访问过的vk人队
}//endif
答:
(1)求顶点vi到顶点vj(i<>j)的最短路径
int shortestpath(ALGraph*G,int i,int j)
{// 对邻接表表示的图G,求顶点vi到顶点vj(i<>j)的最短路径
int dist[MaxVertexNum];
}
}//endwhile
}//BFSM
(2)求源点vi到其余各顶点的最短路径
void shortestpath(ALGraph*G,int i)
{// 对邻接表表示的图G,求顶点vi到顶点vj(i<>j)的最短路径
int dist[MaxVertexNum];
int BFSM(MGraph *G,int i,int j)
{// 对邻接链表表示的图G,求顶点vi到顶点vj(i<>j)的最短路径
i Q;
initQueue(&Q);
for(k=0;k<G->n;k++)
}
}//endwhile
for(k=0;k<G->n;k++)// 打印各顶点的最短路径和长度
{printf("path of %c is %d:",G->vertex[k],dist[k]);
j=k;
int dist[MaxVertexNum],k,j;
int pre[MaxVertexNum];//pre[k]中存放vi到vk路径中,vk的前趋的序号
CirQueue Q;
initQueue(&Q);
for(k=0;k<G->n;k++)
p=p->next;//找vi的下一邻接点
}//endwhile
}//endwhile
for(k=0;k<G->n;k++)// 打印各顶点的最短路径和长度
{printf("path of %c is %d:",G->adjlist[k].vertex,dist[k]);
设图中各边的权值都相等,试以邻接矩阵和邻接表为存储结构,分别写出算法:
(1)求顶点vi到顶点vj(i<>j)的最短路径
(2)求源点vi到其余各顶点的最短路径
要求输出路径上的所有顶点(提示:利用BFS遍历的思想)
}
while (j!=i);
printf("\n");
}
}//end of shortestpath
void shortestpathBFSM(MGraph *G,int i)
{// 对邻接矩阵表示的图G,求顶点vi到其他顶点的最短路径
if(G->edges[i][k]==1&&!visited[k]){//vk未访问
dist[k]++;
if (k==j) return dist[j];
visited[k]=TRUE;
EnQueue(&Q,k);//访问过的vk人队
j=k;
printf("%c",G->adjlist[k].vertex);
do
{
j=pre[j];
print("<-%c",G->adjlist[j].vertex);
printf("\n");
}
}//shortestpathBFSM
if(!visited[p->adjvex]){ //若vj未访问过
dist[p->adjvex]++;
if (p->adjvex==j) return dist[p->adjvex];
visited[P->adjvex]=TRUE;
int pre[MaxVertexNum];//pre[k]中存放vi到vk路径中,vk的前趋的序号
CirQueue Q; //须将队列定义中DataType改为int
EdgeNode *p;
int k,j;
for(k=0;k<G->n;k++)
{dist[k]=0; //距离向量初始化
printf("%c",G->vertex[k]);
do
{
j=pre[j];
printf("<-%c",G->vertex[j]);
}
while (j!=i);
{dist[k]=0; //距离向量初始化
pre[k]=k;
}
visited[k]=TRUE;
EnQueue(&Q,i);
while(!QueueEmpty(&Q)){
i=DeQueue(&Q); //vi出队
for(k=0;k<G->n;k++)//依次搜索vi的邻接点vk
CirQueue Q; //须将队列定义中DataType改为int
EdgeNode *p;
int k;
for(k=0;k<G->n;k++)
dist[k]=0; //距离向量初始化
InitQueue(&Q);//队列初始化
visited[i]=TRUE;
dist[i]=0; //距离向量初始化
visited[k]=TRUE;
EnQueue(&Q,i);
while(!QueueEmpty(&Q)){
i=DeQueue(&Q); //vi出队
for(k=0;k<G->n;k++)//依次搜索vi的邻接点vk
if(G->edges[i][k]==1&&!visited[k]){//vk未访问
dist[k]++;
pre[k]=i;
visited[k]=TRUE;
EnQueue(&Q,k);//访问过的vk人队
pre[k]=k;
}
InitQueue(&Q);//队列
初始化
visited[i]=TRUE;
EnQueue(&Q,i);
while(!QueueEmpty(&Q)){//队非空则执行
i=DeQueue(&Q); //相当于vi出队
p=G->adjlist[i].firstedge; //取vi的边表头指针
while(p){//依次搜索vi的邻接点vk(令p->adjvex=k)
if(!visited[p->adjvex]){ //若vj未访问过
EnQueue(&Q,i);
while(!QueueEmpty(&Q)){//队非空则执行
i=DeQueue(&Q); //相当于vi出队
p=G->adjlist[i].firstedge; //取vi的边表头指针
while(p){//依次搜索vi的邻接点vk(令p->adjvex=k)