[问题描述]
创建一个连通图,采用深度优先、广度优先搜索算法,实现图的遍历。
[实习要求]
(1) 以邻接多重表为存储结构;
(2) 由用户指定任一结点作为起点;
(3) 分别采用深度优先、广度优先搜索算法输出访问序列。
数据结构 图的遍历演示。c++语言
答案:2 悬赏:30 手机版
解决时间 2021-01-28 20:16
- 提问者网友:临风不自傲
- 2021-01-28 07:56
最佳答案
- 五星知识达人网友:轻熟杀无赦
- 2021-01-28 09:00
程序编程如下:
#include
#define INFINITY 32767
#define MAX_V 20 //最多顶点个数
#define QUEUE_SIZE (MAX_V+1) //队列长度
using namespace std;
bool *visited; //访问标志数组
typedef struct //图的邻接矩阵存储结构
{ char *vexs; //顶点向量
int arcs[MAX_V][MAX_V]; //邻接矩阵
int vexnum,arcnum; //图的当前顶点数和边数
}Graph;
class Queue //队列类
{ public: void InitQueue()
{ base=(int *)malloc(QUEUE_SIZE*sizeof(int)); front=rear=0; }
void EnQueue(int e)
{ base[rear]=e; rear=(rear+1)%QUEUE_SIZE; }
void DeQueue(int &e)
{ e=base[front]; front=(front+1)%QUEUE_SIZE; }
public:
int *base; int front; int rear; };
int Locate(Graph G,char c) //图G中查找元素c的位置
{ for(int i=0;i
if(G.vexs[i]==c) return i; return -1; }
void CreateUDN(Graph &G) //创建无向图
{ int i,j,w,s1,s2; char a,b,temp;
printf("输入顶点的总数和边的总数:");
scanf("%d%d",&G.vexnum,&G.arcnum);
temp=getchar(); //接收回车
G.vexs=(char *)malloc(G.vexnum*sizeof(char)); //分配顶点数目
printf("输入%d个顶点分别为:\n",G.vexnum);
for(i=0;i
{ printf("顶点%d:",i); scanf("%c",&G.vexs[i]); temp=getchar();}
for(i=0;i
for(j=0;j
G.arcs[i][j]=INFINITY;
printf("输入%d条边分别为:\n",G.arcnum); //读取边信息并初始化集合
for(i=0;i
{ printf("边%d:",i);
scanf("%c-%c %d",&a,&b,&w); //输入边和权值
temp=getchar(); //接收回车
s1=Locate(G,a); s2=Locate(G,b);
G.arcs[s1][s2]=G.arcs[s2][s1]=w; } }
int FirstVex(Graph G,int k) //图G中顶点k的第一个邻接顶点
{ if(k>=0 && k
{ for(int i=0;i
if(G.arcs[k][i]!=INFINITY) return i; }
return -1; }
int NextVex(Graph G,int i,int j) //图G中顶点i的第j个邻接顶点的下一个邻接顶点
{ if(i>=0 && i=0 && j
{ for(int k=j+1;k
if(G.arcs[i][k]!=INFINITY) return k; }
return -1; }
void DFS(Graph G,int k) //深度优先搜索
{ int i; if(k==-1) //第一次执行DFS时,k为-1
{ for(i=0;i
else
{ visited[k]=true; //访问第k个顶点
printf("%c ",G.vexs[k]);
for(i=FirstVex(G,k);i>=0;i=NextVex(G,k,i))
if(!visited[i]) DFS(G,i); } }
void BFS(Graph G) //广度优先搜索
{ int k;
Queue Q; //辅助队列Q
Q.InitQueue();
for(int i=0;i
if(!visited[i]) //i尚未访问
{ visited[i]=true; printf("%c ",G.vexs[i]);
Q.EnQueue(i); //i入列
while(Q.front!=Q.rear)
{ Q.DeQueue(k); //队头元素出列并置为k
for(int w=FirstVex(G,k);w>=0;w=NextVex(G,k,w))
if(!visited[w]) //w为k的尚未访问的邻接顶点
{ visited[w]=true; printf("%c ",G.vexs[w]);
Q.EnQueue(w); } } } }
void main() //主函数
{ int i; Graph G; CreateUDN(G);
visited=(bool *)malloc(G.vexnum*sizeof(bool));
printf("\n深度优先搜索结果为: ");
for(i=0;i
printf("\n广度优先搜索结果为: ");
for(i=0;i
}
以上程序可以在VC6.0上运行成功!你需要按要求输入顶点总数和边的总数,例如6 7
顶点0:A
顶点1:B
......
边0:A-B 1 这里的1代表AB边的权值。
......
最终可以实现深度优先、广度优先搜索算法输出访问序列。
希望可以帮到你,祝你好运!
#include
#define INFINITY 32767
#define MAX_V 20 //最多顶点个数
#define QUEUE_SIZE (MAX_V+1) //队列长度
using namespace std;
bool *visited; //访问标志数组
typedef struct //图的邻接矩阵存储结构
{ char *vexs; //顶点向量
int arcs[MAX_V][MAX_V]; //邻接矩阵
int vexnum,arcnum; //图的当前顶点数和边数
}Graph;
class Queue //队列类
{ public: void InitQueue()
{ base=(int *)malloc(QUEUE_SIZE*sizeof(int)); front=rear=0; }
void EnQueue(int e)
{ base[rear]=e; rear=(rear+1)%QUEUE_SIZE; }
void DeQueue(int &e)
{ e=base[front]; front=(front+1)%QUEUE_SIZE; }
public:
int *base; int front; int rear; };
int Locate(Graph G,char c) //图G中查找元素c的位置
{ for(int i=0;i
void CreateUDN(Graph &G) //创建无向图
{ int i,j,w,s1,s2; char a,b,temp;
printf("输入顶点的总数和边的总数:");
scanf("%d%d",&G.vexnum,&G.arcnum);
temp=getchar(); //接收回车
G.vexs=(char *)malloc(G.vexnum*sizeof(char)); //分配顶点数目
printf("输入%d个顶点分别为:\n",G.vexnum);
for(i=0;i
for(i=0;i
printf("输入%d条边分别为:\n",G.arcnum); //读取边信息并初始化集合
for(i=0;i
scanf("%c-%c %d",&a,&b,&w); //输入边和权值
temp=getchar(); //接收回车
s1=Locate(G,a); s2=Locate(G,b);
G.arcs[s1][s2]=G.arcs[s2][s1]=w; } }
int FirstVex(Graph G,int k) //图G中顶点k的第一个邻接顶点
{ if(k>=0 && k
return -1; }
int NextVex(Graph G,int i,int j) //图G中顶点i的第j个邻接顶点的下一个邻接顶点
{ if(i>=0 && i
return -1; }
void DFS(Graph G,int k) //深度优先搜索
{ int i; if(k==-1) //第一次执行DFS时,k为-1
{ for(i=0;i
{ visited[k]=true; //访问第k个顶点
printf("%c ",G.vexs[k]);
for(i=FirstVex(G,k);i>=0;i=NextVex(G,k,i))
if(!visited[i]) DFS(G,i); } }
void BFS(Graph G) //广度优先搜索
{ int k;
Queue Q; //辅助队列Q
Q.InitQueue();
for(int i=0;i
{ visited[i]=true; printf("%c ",G.vexs[i]);
Q.EnQueue(i); //i入列
while(Q.front!=Q.rear)
{ Q.DeQueue(k); //队头元素出列并置为k
for(int w=FirstVex(G,k);w>=0;w=NextVex(G,k,w))
if(!visited[w]) //w为k的尚未访问的邻接顶点
{ visited[w]=true; printf("%c ",G.vexs[w]);
Q.EnQueue(w); } } } }
void main() //主函数
{ int i; Graph G; CreateUDN(G);
visited=(bool *)malloc(G.vexnum*sizeof(bool));
printf("\n深度优先搜索结果为: ");
for(i=0;i
for(i=0;i
以上程序可以在VC6.0上运行成功!你需要按要求输入顶点总数和边的总数,例如6 7
顶点0:A
顶点1:B
......
边0:A-B 1 这里的1代表AB边的权值。
......
最终可以实现深度优先、广度优先搜索算法输出访问序列。
希望可以帮到你,祝你好运!
全部回答
- 1楼网友:不想翻身的咸鱼
- 2021-01-28 10:31
你能不能给贴上一个深度遍历错误的用例?你这个输入用例的结果就是1,2,3,4
现在能看出来的就是这个了,
int locatevex (mgraph g,vertextype v){
int i;
for(i = 0;i
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯