严蔚敏C语言无向图BFS和DFS代码实现

x33g5p2x  于2022-05-23 转载在 其他  
字(2.8k)|赞(0)|评价(0)|浏览(254)

完整代码

#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

相关文章