图的遍历DFS与BFS(邻接矩阵)

#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <queue>
#include <Windows.h>

using namespace std;

#define INFINITY INT_MAX
#define MAX_VERTEX_NUM 20  //顶点最多个数
#define LENGTH 5           //顶点字符长度

//邻接矩阵
typedef struct _Graph
{
    int matrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
    char vexs[MAX_VERTEX_NUM][LENGTH];
    int vexnum;
    int arcs;
}Graph;

int LocateVex(const Graph & g, char name[LENGTH])
{
    for (int i = 0; i < g.vexnum; i++)
    {
        if (0 == strcmp(g.vexs[i], name))
        {
            return i;
        }
    }
    return -1;
}

//图的建造
void CreateGraph(Graph &g)
{
    ifstream fcin(_T("graph.txt"));
    fcin>>g.vexnum;
    for (int i = 0; i < g.vexnum; i++)
    {
        for (int j = 0; j < g.vexnum; j++)
        {
            g.matrix[i][j] = INFINITY;
        }
    }
    for (int i = 0; i < g.vexnum; i++)
    {
        fcin>>g.vexs[i];
    }
    fcin>>g.arcs;
    char arcHead[LENGTH];
    char arcTail[LENGTH];
    int weight;
    for (int i = 0; i < g.arcs; i++)
    {
        memset(arcHead, 0, LENGTH);
        memset(arcTail, 0, LENGTH);
        fcin>>arcTail>>arcHead>>weight;
        int x = LocateVex(g, arcHead);
        int y = LocateVex(g, arcTail);
        g.matrix[x][y] = weight;
        g.matrix[y][x] = weight;
    }
}

//v的第一个邻接点
int FirstAdjVex(const Graph &g, int v)
{
    for (int i = 0; i < g.vexnum; i++)
    {
        if (g.matrix[v][i] != INFINITY)
        {
            return i;
        }
    }
    return -1;
}

//v相对于w的下一个邻接点
int NextAdjVex(const Graph &g, int v, int w)
{
    for (int i = w + 1; i < g.vexnum; i++)
    {
        if (g.matrix[v][i] != INFINITY)
        {
            return i;
        }
    }
    return -1;
}

//邻接矩阵的输出
void PrintAdjVex(const Graph &g)
{
    for (int i = 0; i < g.vexnum; i++)
    {
        for (int j = 0; j < g.vexnum; j++)
        {
            if (g.matrix[i][j] == INFINITY)
            {
                cout<<"*"<<'\t';
            }
            else
            {
                cout<<g.matrix[i][j]<<'\t';
            }
        }
        cout<<endl;
    }
    cout<<endl;
}

//深度优先遍历
bool visit[MAX_VERTEX_NUM];

void DFS (Graph& g, int v)
{
    visit[v] = true;
    cout<<g.vexs[v]<<'\t';
    for (int w = FirstAdjVex(g, v); w >= 0; w = NextAdjVex(g, v, w))
    {
        if (!visit[w])
        {
            DFS(g, w);
        }
    }
}

void DFSTraverse(Graph &g)
{
    for (int v = 0; v < g.vexnum; v++)
    {
        visit[v] = false;
    }
    for (int v = 0; v < g.vexnum; v++)
    {
        if (!visit[v])
        {
            DFS(g, v);
        }
    }
    cout<<endl;
}

//广度优先遍历
void BFSTraverse(Graph &g, char vName[LENGTH])
{
    int pos = LocateVex(g, vName);
    for (int v = 0; v < g.vexnum; v++)
    {
        visit[v] = false;
    }
    queue<int> q;
    if (!visit[pos])
    {
        cout<<g.vexs[pos]<<'\t';
        visit[pos] = true;
    }
    q.push(pos);
    while (!q.empty())
    {
        int v = q.front();
        q.pop();
        for (int w = FirstAdjVex(g, v); w >= 0; w = NextAdjVex(g, v, w))
        {
            if (!visit[w])
            {
                cout<<g.vexs[w]<<'\t';
                visit[w] = true;
                q.push(w);
            }
        }
    }
    cout<<endl;
}

//辅助函数,设置控制台的颜色
void SetConsoleTextColor(WORD dwColor)
{
    HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
    if (INVALID_HANDLE_VALUE == handle)
    {
        return;
    }
    SetConsoleTextAttribute(handle, dwColor);
}

int _tmain(int argc, _TCHAR* argv[])
{
    Graph graph;
    CreateGraph(graph);
    SetConsoleTextColor(FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY);
    cout<<"************************邻接矩阵**************************"<<endl;
    PrintAdjVex(graph);
    SetConsoleTextColor(FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY);
    cout<<"**************************DFS****************************"<<endl<<endl;
    DFSTraverse(graph);
    SetConsoleTextColor(FOREGROUND_GREEN | FOREGROUND_INTENSITY);
    cout<<"**************************BFS****************************"<<endl<<endl;
    BFSTraverse(graph, "V1");
    return 0;
}

运行界面如下:

建造图用到的graph.txt如下:

8
V1 V2 V3 V4 V5 V6 V7 V8 
10
V1 V2 10
V1 V3 50
V2 V4 30
V3 V5 40
V3 V6 99
V4 V5 2
V4 V7 60
V5 V7 80
V6 V8 22
V7 V8 70
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值