用邻接矩阵构造图并遍历

/*
输入格式
0 1
0 2
0 3
2 3
*/
#include <iostream>
using namespace std;
const int maxSize = 10;

class MyGraph
{
public:
    MyGraph(int a[],int n,int e);
    ~MyGraph(){};
    void DFSTraverse(int v);
    void BFSTraverse(int v);
private:
    int vertex[maxSize];         //存放图中顶点的数组
    int arc[maxSize][maxSize];   //存放边的数组
    int vertexNum,arcNum;        //图的顶点数和边数
    int* visited;                //记录顶点是否访问过
};
MyGraph::MyGraph(int a[],int n,int e)
{
    vertexNum = n;
    arcNum = e;
    visited = new int[maxSize];
    for(int i = 0;i < vertexNum;i++)
    {
        visited[i] = 0;
    }
    for(int i = 0;i < vertexNum;i++)
    {
        vertex[i] = a[i];
    }
    for(int i = 0;i < vertexNum;i++)
    {
        for(int j = 0;j < vertexNum;j++)
        {
            arc[i][j] = 0;
        }
    }
    for(int k = 0;k < arcNum;k++)
    {
        int i,j;
        cin >> i >> j;
        arc[i][j] = 1;
        arc[j][i] = 1;
    }
}
void MyGraph::DFSTraverse(int v)
{
    cout << vertex[v];                //需要先访问v节点
    visited[v] = 1;
    for(int i = 0;i < vertexNum;i++)
    {
        if(arc[v][i] == 1&&visited[i] == 0)
        {
            DFSTraverse(i);
            //不能写在这里,因为第一个访问的不是v节点
            //cout << vertex[i];
            //visited[i] = 1;
        }
    }
}
void MyGraph::BFSTraverse(int v)
{
    int myqueue[maxSize];
    int head = 0,tail = 0;
    cout << vertex[v];
    visited[v] = 1;
    myqueue[tail++] = v;
    while(head != tail)
    {
        v = myqueue[head++];
        for(int i = 0;i < vertexNum;i++)
        {
            if(arc[v][i] == 1&&visited[i] == 0)
            {
                cout << vertex[i]; //在入队前输出该节点的值
                visited[i] = 1;
                myqueue[tail++] = i;
            }
        }
    }
}
int main()
{
    int a[4] = {0,1,2,3};
    MyGraph myGraph(a,4,4);
    myGraph.BFSTraverse(1);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/geek_sun/article/details/80498163