美文网首页
邻接表|DFS|BFS

邻接表|DFS|BFS

作者: 绍重先 | 来源:发表于2017-12-06 21:12 被阅读0次

结构定义

#define INIFINITY 1000              // 最大值
#define MAX_VERTEX_NUM 20               //最大顶点数
#include<string> 

using namespace std;
typedef enum{DG,DN,UDG,UDN} GraphKind;  //图的四种类型
typedef string VertexType;
typedef int  InfoType;
typedef  struct ArcNode{
     int adjvex;
     InfoType weight;
     struct ArcNode *nextarc;
}ArcNode;

typedef struct Vnode{
      VertexType  data;
      ArcNode      *firstarc;
}VNode, AdjList[MAX_VERTEX_NUM ]; 

typedef struct {
       AdjList   vertices;
       int  vexnum,arcnum;
       GraphKind kind;
}ALGraph;

创建无向图

Status CreateUDG(ALGraph &G) { //建立无向图的邻接表
    int i,j,k;
    VertexType v1,v2;
    ArcNode *p,*q;
    cout<<endl<<"输入图的顶点数(VEX)和边数(ARC):"<<endl;
    cout<<"vexnum|顶点数:";
    cin>>G.vexnum;
    cout<<"arcnum|边数:";
    cin>>G.arcnum;
    cout<<endl;
    cout<<"输入图的顶点信息:"<<endl;
    for (i=0; i<G.vexnum; i++) {
        cout<<"VEX "<<i<<":";
        cin>>G.vertices[i].data;
        G.vertices[i].firstarc=NULL;
    }

    cout<<endl;
    cout<<"输入边的信息v1,v2"<<endl;
    for (k=0; k<G.arcnum; k++) {
        cout<<endl<<"V1:";
        cin>>v1;

        cout<<"V2:";
        cin>>v2;
        i=LocateVex(G,v1);
        cout<<"find v1:"<<i<<endl;
        j=LocateVex(G,v2);
        cout<<"find v2:"<<j<<endl;
        //if(i>=0&&i<G.vexnum&&j>=0&&j<G.vexnum) {
        if(i!=-1&&j!=-1) {
            p=(ArcNode *)malloc (sizeof(ArcNode ));
            p->adjvex=j;
            p->nextarc=G.vertices[i].firstarc;
            G.vertices[i].firstarc=p;

            q=(ArcNode *)malloc (sizeof(ArcNode ));
            q->adjvex=i;
            q->nextarc=G.vertices[j].firstarc;
            G.vertices[j].firstarc=q;
        }

        else {
            cout<<"节点输入错误 请重新输入"<<endl;
            k = k-1;
            continue;
        }
    }//for k
    return OK;
}//CreateUDG

输出

void PrintGraph(ALGraph G) {
    int i,j;
    ArcNode *p;
    cout<<endl<<"图的顶点数和边数:";
    cout<<setw(3)<<G.vexnum<<setw(3)<<G.arcnum;
    cout<<endl<<"图的顶点信息:"<<endl;
    for (i=0; i<G.vexnum; i++) cout<<setw(3)<<G.vertices[i].data;
    cout<<endl<<"图的邻接表:"<<endl;
    for (i=0; i<G.vexnum; i++) {
        cout<<setw(3)<<G.vertices[i].data<<"的邻接点:";
        p=G.vertices[i].firstarc;
        while (p) {
            j=p->adjvex;
            cout<<G.vertices[j].data;
            p=p->nextarc;
        }//while
        cout<<endl;
    }//for

    cout<<endl;
}

DFS

int visited[MAX_VERTEX_NUM];
void DFS(ALGraph &G,int v) {
    visited[v] = true;
    cout<<G.vertices[v].data<<" ";
    ArcNode *p = G.vertices[v].firstarc;
    while(p) {
        if(!visited[p->adjvex])
            DFS(G,p->adjvex);
        p = p->nextarc;
    }
}

void DFSTraverse(ALGraph &G) {
    for(int i=0; i<G.vexnum; i++)
        visited[i] = false; //初始化访问数组
    for(int i=0; i<G.vexnum; i++) {
        if(!visited[i])
            DFS(G,i);
    }
}

BFS

void BFSTraverse(ALGraph &G) {
    for(int i=0; i<G.vexnum; i++)
        visited[i] = false;
    queue<int>q;
    for(int i=0; i<G.vexnum; i++) {
        if(!visited[i]) {
            visited[i] = true;
            q.push(i);
            cout<<G.vertices[i].data<<" ";

            while(!q.empty()) {
                int x = q.front();
                q.pop();
                ArcNode*p = G.vertices[i].firstarc;
                while(p) {
                    if(!visited[p->adjvex]) {
                        //  p的邻接点未被访问过
                        visited[p->adjvex] = true;
                        cout<<G.vertices[p->adjvex].data<<" ";
                    }
                    p = p->nextarc;
                }
            }
        }
    }
}

相关文章

  • 邻接表|DFS|BFS

    结构定义 创建无向图 输出 DFS BFS

  • 图论小结

    图的存储 邻接矩阵 邻接表 图的遍历 DFS(双向DFS) BFS(剪枝) 单源最短路径算法 dij 条件:无负权...

  • 图的遍历

    1.采用深度优先搜索(DFS)遍历图 邻接矩阵: 邻接表: 2.采用广度优先搜索(BFS)遍历图 邻接矩阵: 邻接...

  • 第七章 图

    邻接表定义 邻接表求各点入度 邻接表各点出度 DFS与BFS遍历 已知一个无向图G的邻接表存储表示如下,试写出从顶...

  • 无向图 图的表示方法:邻接表 dfs和bfs的区别:dfs是用栈,bfs用队列 有向图 有向无环图(DAG): 不...

  • 五. 图

    图的存储 顺序表(矩阵存储) 链表(邻接链表) 图的遍历 BFS, DFS 图的最小生成树 Prim, Krusk...

  • 图的搜索算法:BFS和DFS详解(Java实现)

    图的搜索算法:BFS和DFS详解(Java实现) 上一篇我们介绍了图的基本概念以及图的存储方式:邻接矩阵和邻接表;...

  • 各种DFS

    DFS邻接矩阵遍历图 DFS邻接表遍历图 DFS回溯(不走重复路径) DFS背包(可重复选) DFS背包(不可重复选)

  • 课程设计——图的建立和遍历(基于邻接表和邻接矩阵存储)

    本课程设计主要完成邻接矩阵和邻接表两种不同存储方式的图的建立和遍历,其中遍历部分分别进行了DFS和BFS两种不同形...

  • 图的遍历

    广度优先搜索BFS 空间复杂度 O(|V|)时间复杂度 邻接表O(|V|+|E|)邻接矩阵O(|V|^2) BFS...

网友评论

      本文标题:邻接表|DFS|BFS

      本文链接:https://www.haomeiwen.com/subject/edalixtx.html