邻接矩阵存储带权值的无向图

来源:互联网 发布:2级钢筋弯勾 算法 编辑:程序博客网 时间:2024/06/02 04:31

vertex.h

#pragma onceclass vertex{public:    char data;//节点用字符表示    vertex(char c=' ');    bool isVisited;//是否被访问过    void visited();};

vertex.cpp

#include"vertex.h"# include<iostream>using namespace std;//构造函数,初始时未被访问,所以为falsevertex::vertex(char c) :data(c), isVisited(false){}void vertex::visited(){    cout << data << " ";}

undiGraph(adjacent marix).h

#pragma once# include"vertex.h"//undigraph:无向图//matrix: 矩阵//adjacency: 邻接# define MAX 65535//带权无向图的邻接矩阵方式存储class myUndiGraph{public:    myUndiGraph(int vertex,int edge);//i:顶点个数,j:边数    ~myUndiGraph();    void create();//创建邻接矩阵存储的无向图    void traverMatrix();//遍历邻接矩阵    //double *getVertex(double x);//获取元素    void DFS(int i);//depth first search深度优先搜索    void BFS(int j);//breath first search广度优先搜索    void setVisitedFalse();//记得搜索前将顶点的访问标设为falseprivate:    int iVertex;//顶点数    int iEdge;//边数    double **adjacentMatrix;//邻接矩阵    vertex* vertexInfo;//顶点信息};

undiGraph(adjacent marix).cpp

# include"undiGraph(adjacent marix).h"# include<iostream># include"myQuene.h"using namespace std;myUndiGraph::myUndiGraph(int i,int j):iVertex(i),iEdge(j),adjacentMatrix(NULL){    this->adjacentMatrix = new double*[i];    vertexInfo = new vertex[iVertex];    for (int k = 0;k < i;++k)    {        adjacentMatrix[k] = new double[i];    }    for (int i1 = 0;i1 < i;i1++)        for (int j1 = 0;j1 < i;j1++)            if(i1==j1)                adjacentMatrix[i1][j1] = 0;//对角线为0            else adjacentMatrix[i1][j1] = MAX;}myUndiGraph::~myUndiGraph(){    for (int i1 = 0;i1 < iVertex;i1++)        delete[]adjacentMatrix[i1];    delete []adjacentMatrix;    delete[]vertexInfo;}void myUndiGraph::create(){    cout << "请输入顶点信息:" << endl;    for (int i = 0;i < iVertex;i++)        cin >> vertexInfo[i].data;    cout << "请依次输入无向图中相关联的顶点(0表示第一个顶点)及权值" << endl;    int a, b;    for (int i = 0;i < iEdge;++i)    {        cin >> a >> b;        cin >> adjacentMatrix[a][b];        adjacentMatrix[b][a] = adjacentMatrix[a][b];            }}void myUndiGraph::traverMatrix(){    for (int i1 = 0;i1 < iVertex;i1++)    {        for (int j1 = 0;j1 < iVertex;j1++)            cout << adjacentMatrix[i1][j1] << "\t";        cout << endl;    }}void myUndiGraph::DFS(int i)//depth first search深度优先搜索{    //从第一个节点开始搜索(下标为0)    if (!vertexInfo[i].isVisited)//如果第i+1个节点为被访问    {        vertexInfo[i].visited();        vertexInfo[i].isVisited = true;    }    for (int j = i+1;j < iVertex;j++)//在第i+1个顶点的邻接点中遍历    {        if (adjacentMatrix[i][j] != MAX)            DFS(j);    }}void myUndiGraph::BFS(int j)//breath first search广度优先搜索{       if (!vertexInfo[j].isVisited)//如果该节点为访问    {        vertexInfo[j].visited();        vertexInfo[j].isVisited = true;    }    myQuene<int> m(30);    m.in(j);    int x;    while (!m.empty())    {        m.out(x);        for (int i = x + 1;i < iVertex;++i)        {            if (adjacentMatrix[x][i] != MAX)//第j+1个节点的所有邻接点            {                if (!vertexInfo[i].isVisited)                {                    vertexInfo[i].visited();                    vertexInfo[i].isVisited = true;                    m.in(i);                }            }        }    }}void myUndiGraph::setVisitedFalse(){    for (int i = 0;i < iVertex;++i)        vertexInfo[i].isVisited = false;}

main.cpp

# include<iostream># include"undiGraph(adjacent marix).h"using namespace std;int main(){    myUndiGraph m(8, 9);    m.create();    cout << "\n此图的邻接矩阵为:\n";    m.traverMatrix();    cout << "深度优先搜索结果为:" << endl;    m.DFS(0);    cout << endl;    m.setVisitedFalse();//记得将访问标志设为false    cout << "广度优先搜索结果为:" << endl;    m.BFS(0);    cout << endl;    system("pause");    return 0;}

其中myQuene是之前实现的队列
来测试一下,比如这个图
这里写图片描述
这里写图片描述

0 0
原创粉丝点击