云服务器

商务合作:179001057@qq.com

第十二周项目四 利用遍历思想求解图问题(6、7)

xiaoxiao2021-09-20  25


某平台价值19860元的编程课程资料免费领取【点我领取】


问题代码: /* * Copyright (c) 2016, 烟台大学计算机与控制工程学院 * All rights reserved. * 文件名称:Cube007.cpp * 作 者:李玲 * 完成日期:2016年11月17日 *问题描述:假设图G采用邻接表存储,分别设计实现以下要求的算法,要求用区别于示例中的图进行多次测试,通过观察输出值,掌握相关问题的处理方法。    (1)设计一个算法,判断顶点u到v是否有简单路径    (2)设计一个算法输出图G中从顶点u到v的一条简单路径(设计测试图时,保证图G中从顶点u到v至少有一条简单路径)。    (3)输出从顶点u到v的所有简单路径。    (4)输出图G中从顶点u到v的长度为s的所有简单路径。    (5)求图中通过某顶点k的所有简单回路(若存在) */ #include <stdio.h> #include <malloc.h> #include "graph.h" typedef struct { int data; //顶点编号 int parent; //前一个顶点的位置 } QUERE; //非环形队列类型 void ShortPath(ALGraph *G,int u,int v) { //输出从顶点u到顶点v的最短逆路径 ArcNode *p; int w,i; QUERE qu[MAXV]; //非环形队列 int front=-1,rear=-1; //队列的头、尾指针 int visited[MAXV]; for (i=0; i<G->n; i++) //访问标记置初值0 visited[i]=0; rear++; //顶点u进队 qu[rear].data=u; qu[rear].parent=-1; visited[u]=1; while (front!=rear) //队不空循环 { front++; //出队顶点w w=qu[front].data; if (w==v) //找到v时输出路径之逆并退出 { i=front; //通过队列输出逆路径 while (qu[i].parent!=-1) { printf("- ",qu[i].data); i=qu[i].parent; } printf("-\n",qu[i].data); break; } p=G->adjlist[w].firstarc; //找w的第一个邻接点 while (p!=NULL) { if (visited[p->adjvex]==0) { visited[p->adjvex]=1; rear++; //将w的未访问过的邻接点进队 qu[rear].data=p->adjvex; qu[rear].parent=front; } p=p->nextarc; //找w的下一个邻接点 } } } int Maxdist(ALGraph *G,int v) { ArcNode *p; int i,j,k; int Qu[MAXV]; //环形队列 int visited[MAXV]; //访问标记数组 int front=0,rear=0; //队列的头、尾指针 for (i=0; i<G->n; i++) //初始化访问标志数组 visited[i]=0; rear++; Qu[rear]=v; //顶点v进队 visited[v]=1; //标记v已访问 while (rear!=front) { front=(front+1)%MAXV; k=Qu[front]; //顶点k出队 p=G->adjlist[k].firstarc; //找第一个邻接点 while (p!=NULL) //所有未访问过的相邻点进队 { j=p->adjvex; //邻接点为顶点j if (visited[j]==0) //若j未访问过 { visited[j]=1; rear=(rear+1)%MAXV; Qu[rear]=j; //进队 } p=p->nextarc; //找下一个邻接点 } } return k; } int main() { ALGraph *G; int A[9][9]= { {0,1,1,0,0,0,0,0,0}, {0,0,0,1,1,0,0,0,0}, {0,0,0,0,1,1,0,0,0}, {0,0,0,0,0,0,1,0,0}, {0,0,0,0,0,1,1,0,0}, {0,0,0,0,0,0,0,1,0}, {0,0,0,0,0,0,0,1,1}, {0,0,0,0,0,0,0,0,1}, {0,0,0,0,0,0,0,0,0} }; //请画出对应的有向图 ArrayToList(A[0], 9, G); ShortPath(G,0,7); printf("离顶点0最远的顶点:%d\n",Maxdist(G,0)); return 0; }

运行结果: