数据结构(12):图 深度优先遍历(DFS)

/*-----------------------------------------------*/
/* 邻接矩阵的DFS */
// 基于 数据结构(14) 中的邻接矩阵的结构 
#include <iostream>
using namespace std;
typedef char VertexType;
typedef int EdgeType;
const int MAXVEX = 100;
const int INFINITY = 65535;

typedef struct
{
    VertexType vexs[MAXVEX];
    EdgeType arc[MAXVEX][MAXVEX];
    int numVertexes, numEdges;
} MGraph;

void CreateMGraph(MGraph &G)
{
    int i,j,k,w;
    cout<<"输入顶点数和边数:";
    cin>>G.numVertexes>>G.numEdges;

    cout<<"输入顶点信息: "<<endl;
    for(i=0;i<G.numVertexes;i++)
        cin>>G.vexs[i];

    for(i=0;i<G.numVertexes;i++)
        for(j=0;j<G.numVertexes;j++)
            G.arc[i][j] = INFINITY;

    for(k=0;k<G.numEdges;k++)
    {
        cout<<"输入边(vi,vj)上的下标i,下标j和权w:"<<endl;
        cin>>i>>j>>w; 

        G.arc[i][j] = w;
        G.arc[j][i] = G.arc[i][j];
    }
}
/*-----------------------------------------------*/
// DFS
bool visit[MAXVEX];         // 用于标记顶点是否已被遍历 
void DFS(MGraph G, int i)   // DFS搜索 
{
    int j;
    visit[i] = true;                        // 当前顶点标记为 已遍历 
    cout<<G.vexs[i]<<ends;                  // 输出顶点信息(可改为其他操作) 

    for(j=0;j<G.numVertexes;j++)            // 遍历与当前顶点有联系的其他顶点 
        if(G.arc[i][j] == 1 && !visit[j])
            DFS(G,j);                       // 递归 
}
// DFSTraverse 
void DFSTraverse(MGraph G)
{
    int i;
    for(i=0;i<G.numVertexes;i++)            // 初始化标记数组为 未遍历 
        visit[i] = false;

    for(i=0;i<G.numVertexes;i++)            // 对每一个没有遍历过的顶点进行DFS 
        if(!visit[i])
            DFS(G,i);
}

int main()
{
    MGraph G;
    CreateMGraph(G);
    DFSTraverse(G);

    return 0;
}
/*-----------------------------------------------*/
/* 邻接表的DFS */
// 基于 数据结构(14) 中的邻接表的结构 
#include <iostream>
using namespace std;
const int MAXVEX = 100;

typedef char VertexType;
typedef int EdgeType;

typedef struct EdgeNode
{
    int adjvex;
    EdgeType weight;
    struct EdgeNode *next;  
} EdgeNode;

typedef struct VertexNode
{
    VertexType data;
    EdgeNode *firstedge;
} VertexNode, AdjList[MAXVEX];

typedef struct
{
    AdjList adjList;
    int numVertexes, numEdges;
} GraphAdjList;

void CreateALGraph(GraphAdjList &G)
{
    int i,j,k,w;
    EdgeNode *e;
    cout<<"输入顶点数和边数:";
    cin>>G.numVertexes>>G.numEdges;

    cout<<"输入各顶点的信息:"<<endl;
    for(i=0;i<G.numVertexes;i++)
    {
        cin>>G.adjList[i].data;
        G.adjList[i].firstedge = NULL;
    }

    for(k=0;k<G.numEdges;k++)
    {
        cout<<"输入边(vi,vj)上的顶点序号:"<<endl;
        cin>>i>>j>>w;

        e = new EdgeNode;
        e->adjvex = j;
        e->weight = w;
        e->next = G.adjList[i].firstedge;
        G.adjList[i].firstedge = e;

        e->adjvex = i;
        e->weight = w;
        e->next = G.adjList[j].firstedge;
        G.adjList[j].firstedge = e;
    }
}
/*-----------------------------------------------*/

// DFS
bool visit[MAXVEX];                         // 用于标记顶点是否已被遍历
void DFS(GraphAdjList GL, int i)            // DFS搜索
{
    EdgeNode *p;
    visit[i] = true;                        // 当前顶点标记为 已遍历
    cout<<GL.adjList[i].data<<ends;         // 输出顶点信息(可改为其他操作) 

    p = GL.adjList[i].firstedge;            // 指向当前邻接顶点 指向的子结点 
    while(p)
    {
        if(!visit[p->adjvex])               // 遍历与当前邻接顶点有联系的 其他顶点 
            DFS(GL,p->adjvex);
        p = p->next;                        // 继续遍历下一个子结点 
    }
}
void DFSTraverse(GraphAdjList GL)
{
    int i;
    for(i=0;i<GL.numVertexes;i++)            // 初始化标记数组为 未遍历 
        visit[i] = false;       

    for(i=0;i<GL.numVertexes;i++)           // 对每一个没有遍历过的顶点进行DFS 
        if(!visit[i])
            DFS(GL,i);
}

int main()
{
    GraphAdjList G;
    CreateALGraph(G);
    DFSTraverse(G);

    return 0;
}
    原文作者:数据结构之图
    原文地址: https://blog.csdn.net/MadBam_boo/article/details/51347953
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞