【数据结构算法】图(四):基于邻接矩阵的深度优先搜索(DFS) C++实现

利用邻接矩阵的数据结构表示图,并实现DFS

// ConsoleApplication1.cpp : 定义控制台应用程序的入口点。
#include "stdafx.h"
#include<iostream>
#include<stdio.h>
#define Acsii   -48       //将输入字符转换成数字
#define MaxVex  100       //最大顶点数
#define INF     65535     //定义最大值(充当无穷大)
bool visited[MaxVex];     //在深度优先遍历中判断是否被遍历过
typedef char VertexType;  //顶点类型
typedef int  EdgeType;    //边类型
using namespace std;

//邻接矩阵结构体
typedef struct{
    VertexType vexs[MaxVex];
    EdgeType   arc[MaxVex][MaxVex];
    int numVertexs, numEdges;        //当前图中的结点数以及边数
}AdjacencyMatrix;

//创建邻接矩阵
void CreateAMatrix(AdjacencyMatrix* AM)
{

    cout << "输入顶点数和边数:";
    cin >> AM->numVertexs >> AM->numEdges;

    cout << "==============================\n";
    cout << "输入各个顶点:" << endl;

    //邻接矩阵顶点输入
    for (int i = 0; i < AM->numVertexs; i++)
    {
        char v;
        cout << "顶点%d:" << i+1;
        cin >> v;
        AM->vexs[i] = v;

    }

    //邻接矩阵初始化
    for (int i = 0; i < AM->numVertexs; i++)
    {
        for (int j = 0; j < AM->numVertexs; j++)
        {
            AM->arc[i][j] = INF;
        }
    }


    cout << "==============================\n";
    //输入边的值
    for (int k = 0; k < AM->numEdges; k++)
    {
        char i, j, w;
        cout << "输入边(vi,vj)中的下标i和j和权重w:" ;
        cin >> i >> j >> w;

        AM->arc[i+Acsii][j+Acsii] = w;
        AM->arc[j][i] = AM->arc[i][j];      
    }

}

void DisplayAMatrix(AdjacencyMatrix* AM)
{
    //打印顶点
    //for (int i = 0; i < AM->numVertexs; i++)
    //{
    //  cout << AM->vexs[i] << endl;
    //}

    //打印矩阵信息
    for (int i = 0; i < AM->numVertexs; i++)
    {
        for (int j = 0; j < AM->numVertexs; j++)
        {
            cout<<AM->arc[i][j]<<"  ";
        }
        cout << endl;
    }
}
//图的深度优先遍历
void DFS(AdjacencyMatrix* AM,int i)
{
    visited[i] = 1;
    cout << AM->vexs[i];

    //递归
    for (int j = 0; j < AM->numVertexs; j++)
    {
        if (AM->arc[i][j] != INF && !visited[j])
        {
            DFS(AM, j);
        }
    }
}
void DFSTraverse(AdjacencyMatrix* AM)
{
    for (int i = 0; i < AM->numVertexs; i++)
    {
        visited[i] = 0;
    }
    for (int i = 0; i < AM->numVertexs; i++)
    {
        if (!visited[i])
            DFS(AM, i);
    }
}
int main(){
    AdjacencyMatrix G,h;

    CreateAMatrix(&G);

    DisplayAMatrix(&G);

    DFSTraverse(&G);


    return 0;
}

猜你喜欢

转载自blog.csdn.net/qiu931110/article/details/80433188