#include<iostream>
using namespace std;
#define MVNum 100 //最大顶点数
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define MAXSIZE 10
typedef int Status;
typedef struct {
char vexs[MVNum];//顶点表
int arcs[MVNum][MVNum];//邻接矩阵
int vexnum,arcnum;//顶点数和边数
}AMGraph;
/*返回顶点在顶点表中的位置*/
int LocateVex(AMGraph G,char v){
for (int i = 0; i < G.vexnum; ++i) {
if (v == G.vexs[i]){
return i;
}
}
}
/*创建无向图*/
Status CreateUDN(AMGraph &G){
cout<<"请输入顶点数和边数"<<endl;
cin>>G.vexnum>>G.arcnum;
//将顶点存入顶点表
for (int i = 0; i < G.vexnum; ++i) {
cout<<"输入第"<<(i+1)<<"顶点"<<endl;
cin>>G.vexs[i];
}
//初始化矩阵
for (int j = 0; j < G.vexnum; ++j) {
for (int i = 0; i < G.vexnum; ++i) {
G.arcs[j][i] = 0;
}
}
//初始化无向图
for (int k = 0; k < G.arcnum; ++k) {
char v1,v2;
cout<<"输入第"<<k<<"边的两个顶点(空格隔开 例:a b)"<<endl;
cin>>v1>>v2;
int i = LocateVex(G,v1);
int j = LocateVex(G,v2);
G.arcs[i][j] = 1;
G.arcs[j][i] = 1;
}
return OK;
}
bool visited[MVNum];
/*深度优先遍历DFS*/
void DFS_AM(AMGraph G,int v,bool visited[]){
cout<<G.vexs[v];
//将访问过的结点置为true
visited[v] = true;
//依次检查v所在的行
for (int w = 0; w < G.vexnum; ++w) {
//w是v的邻接点
if (G.arcs[v][w] != 0 && (!visited[w]))
DFS_AM(G,w,visited);
}
}
typedef struct {
int *base;//存储空间的基地址
int front;//头指针
int rear;//尾指针
}SqQueue;
/*初始化队列*/
Status InitQueue(SqQueue &Q){
Q.base = new int[MAXSIZE];
if (!Q.base) exit(OVERFLOW);//存储空间分配失败
Q.front = Q.rear = 0;//头尾指针置零
return OK;
}
/*循环队列入队*/
Status EnQueue(SqQueue &Q,int e){
if ((Q.rear+1)%MAXSIZE == Q.front) //(循环)队列满了
return ERROR;
Q.base[Q.rear] = e;//在队尾插入元素
Q.rear = (Q.rear+1)%MAXSIZE;//队尾指针加1
return OK;
}
/*循环队列出队*/
Status DeQueue(SqQueue &Q,int &e){
if (Q.front == Q.rear)//对空
return ERROR;
e = Q.base[Q.front];
Q.front = (Q.front+1)%MAXSIZE;//对头指针加1
return OK;
}
bool QueueEmpty(SqQueue Q){
if (Q.front == Q.rear)
return true;
return false;
}
/*获取第一个邻接结点*/
int FirstAdjVex(AMGraph G,int v){
for (int i = 0; i < G.vexnum; ++i) {
if(G.arcs[v][i] != 0)
return i;
}
}
/*获取下一个邻接点*/
int NextAdjVex(AMGraph G,int u,int w){
for (int i = w+1; i < G.vexnum; ++i) {
if (G.arcs[u][i] != 0)
return i;
}
return -1;
}
/*广度优先遍历*/
void BFS_AM(AMGraph G,int v,bool visited[]){
cout<<G.vexs[v];
visited[v] = true;
SqQueue Q;
InitQueue(Q);
EnQueue(Q,v);
while (!QueueEmpty(Q)){
int u;
DeQueue(Q,u);
for (int w = FirstAdjVex(G,u); w >=0 ; w=NextAdjVex(G,u,w)) {
if(!visited[w]){
cout<<G.vexs[w];
visited[w] = true;
EnQueue(Q,w);
}
}
}
}
int main(){
AMGraph G;
CreateUDN(G);
for (int i = 0; i < MVNum; ++i) {
visited[i] = false;
}
cout<<"深度优先算法"<<endl;
DFS_AM(G,0,visited);
for (int i = 0; i < MVNum; ++i) {
visited[i] = false;
}
cout<<endl<<"广度优先算法"<<endl;
BFS_AM(G,0,visited);
return 0;
}
请输入顶点数和边数
5 6
输入第1顶点
a
输入第2顶点
b
输入第3顶点
c
输入第4顶点
d
输入第5顶点
e
输入第0边的两个顶点(空格隔开 例:a b)
a b
输入第1边的两个顶点(空格隔开 例:a b)
a d
输入第2边的两个顶点(空格隔开 例:a b)
c b
输入第3边的两个顶点(空格隔开 例:a b)
c d
输入第4边的两个顶点(空格隔开 例:a b)
c e
输入第5边的两个顶点(空格隔开 例:a b)
b e
深度优先算法
abcde
广度优先算法
abdce
Process finished with exit code 0
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://blog.csdn.net/m0_60117382/article/details/124926396
内容来源于网络,如有侵权,请联系作者删除!