SCNU_数据结构作业_实验5 图的算法与应用

1、 邻接矩阵(验证实验【必做】)
以lab5_1.cpp为基础,参考课本180页-182页的内容,建立无向图的邻接矩阵存储结构,对建立的无向图进行深度优先遍历和广度优先遍历。请把答案代码直接补充在源文件中。课本178页图6-7的输入和输出样张如下图所示。
SCNU_数据结构作业_实验5 图的算法与应用

#include <iostream>
using namespace std;

const int MaxSize = 10;           //图中最多顶点个数
int visited[MaxSize]={0};//对全局的点初始化,表示都没有被访问

template <class DataType>
class MGraph
{
public:
	MGraph(DataType a[] , int n, int e);    //构造函数,建立具有n个顶点e条边的图
	~MGraph( ){}                  //析构函数为空
	void DFTraverse(int v);              //深度优先遍历图
	void BFTraverse(int v);               //广度优先遍历图
private:
    DataType vertex[MaxSize];          //存放图中顶点的数组
    int edge[MaxSize][MaxSize];          //存放图中边的数组
    int vertexNum, edgeNum;             //图的顶点数和边数
};

补充1//
//构造函数-图的建立
template <class DataType>
MGraph<DataType>::MGraph(DataType a[], int n, int e)
{
    int i, j, k;
    vertexNum = n;
    edgeNum = e;
    //存放顶点
    for(i = 0; i < vertexNum; i++)
        vertex[i] = a[i];
    //初始化邻接矩阵
    for(i = 0; i < vertexNum; i++)
        for(j = 0; j < vertexNum; j++)
            edge[i][j] = 0;
    //依次输入每一条边
    for(k = 0; k < edgeNum; k++)
    {
        cout<< "请输入两个边的顶点序号:";
        cin >>i >>j;//输入边依附的两个顶点的编号
        edge[i][j] = 1;
        edge[j][i] = 1;//初始化边

    }

}

//深度优先遍历
template <class DataType>
void MGraph<DataType>::DFTraverse(int v)
{
    cout <<vertex[v];
    visited[v] = 1;//访问了的点,就改写为1,表示已经访问过了
    for(int j = 0; j < vertexNum; j++)
        if(edge[v][j] == 1 && visited[j] == 0)//如果边存在,且点没被访问
            DFTraverse(j);
}

//广度优先遍历
template <class DataType>
void MGraph<DataType>::BFTraverse(int v)
{
    int w, j, Q[MaxSize];//采用顺序队列
    int front = -1, rear = -1;
    cout <<vertex[v];
    visited[v] = 1;//输出顶点的值,表示已经访问
    Q[++rear] = v;//别访问的顶点入队
    while(front!=rear)//当队列非空,头尾不相等,队列就不为空
    {
        w = Q[++front];//将队头元素出队送到v中
        for(j = 0; j < vertexNum; j++)
            if(edge[w][j] == 1 && visited[j] == 0)//如果边存在,点未被访问
        {
            cout <<vertex[j];//输出点数据
            visited[j] = 1;//表示已经访问
            Q[++rear] = j;//推下一个进来
        }
    }
}

//

int main( )
{
    int i;
	char ch[]={'A','B','C','D','E','F'};
	MGraph<char> MG(ch, 6, 6);//建立6个顶点,6条边的无向图

补充2//
    for(i = 0; i < MaxSize; i++)
        visited[i] = 0;//对每个点初始化未被访问
    cout << "深度优先遍历序列是:";
    MG.DFTraverse(0);//从顶点0出发进行深度优先遍历
    cout << "\n";
    for(i = 0; i < MaxSize; i++)
        visited[i] = 0;
    cout<< "广度优先遍历序列是:";
    MG.BFTraverse(0);//从顶点0出发进行广度优先遍历
    return 0;

//
}

太难了,完全是照着书本来,不然根本不会(捂脸)
磕磕碰碰,各种小错误,完全像新学一样,懵懵懂懂的,什么都不懂。

上一篇:四、考研数据结构笔记——栈与队列基础知识(栈与队列的理解,易混淆点,熟记的代码)


下一篇:leetcode 128 最长连续序列