图的基本操作

1.在刚开始界面,提示用户输入要构造图的信息(边数,顶点)

 

 

2.接下会进行广度优先遍历和深度优先遍历以及打印邻接矩阵 

 

3.源码如下所示: 

#include <iostream>
#include<queue>
#include<stack>
#include<string>
const int MaxSize=100;
using namespace std;

template <typename t>
class AMGraph
{
public:
    AMGraph();
    ~AMGraph();
    int locate(t v);
    void bfTraverse(int v);
    void dfTraverse(int v);
    void print();
    void dft();
private:
    t v1, v2;
    int m, n;
    t vertex[MaxSize];
    int edge[MaxSize][MaxSize];
    bool visited[MaxSize];
    int vertexNum, edgeNum;
};
template<typename t>
AMGraph<t>::AMGraph()
{
    //AMGraph<string> g;
    cout << "请输入顶点数和边数:" << endl;
    cin >> vertexNum >> edgeNum;
    cout << "请输入顶点的信息:" << endl;
    for (int i = 0; i < vertexNum; i++)
    {
        cin >> vertex[i];
    }
    for (int i = 0; i < vertexNum; i++)
    {
        for (int j = 0; j < vertexNum; j++)
        {
            edge[i][j] = 0;
        }
    }
    cout << "请输入边的信息:" << endl;
    for (int i = 0; i < edgeNum; i++)
    {
        cin >> v1 >> v2;
        m = locate(v1);
        n = locate(v2);
        edge[m][n] = 1;
        edge[n][m] = 1;
    }
}
template<typename t>
AMGraph<t>::~AMGraph()
{

}
template<typename Element>
void AMGraph<Element>::dft()  
{
    for (int i = 0; i < vertexNum; i++)
    {
        visited[i] = false;
    }
    for (int i = 0; i < vertexNum; i++)
    {
        if ( !visited[i])
            dfTraverse(0);
    }
}
template <typename t>
void AMGraph<t>::print()
{
    for (int i = 0; i < vertexNum; i++)
    {
        cout << endl;
        for (int j = 0; j < vertexNum; j++)
        {
            cout << edge[i][j]<<"  ";
        }
    }
}
template <typename t>
int AMGraph<t>::locate(t v)
{
    for (int i = 0; i < vertexNum; i++)
    {
        if (v == vertex[i])
        {
            return i;
        }
    }
    return -1;
}
template <typename t>
void AMGraph<t>::dfTraverse(int v)
{
    visited[v] = true;
    cout << vertex[v]<<" ";
    for (int w = 0; w < vertexNum; w++)
    {
        if (edge[v][w] == 1 && !visited[w])
        {
            dfTraverse(w);
        }
    }
}
template<typename t>
void AMGraph<t>::bfTraverse(int v)
{
    for (int i = 0; i < vertexNum; i++)
    {
        visited[i] = false;
    }
    queue<int>q;
    cout << vertex[v]<<" ";
    visited[v] = true;
    q.push(v);
    while (!q.empty())
    {
        v = q.front();
        q.pop();
        for (int j = 0; j < vertexNum; j++)
        {
            if (edge[v][j] == 1 && !visited[j])
            {
                visited[j] = true;
                cout << vertex[j]<<" ";
                q.push(j);
            }
        }
    }
}
int main()
{
    AMGraph<string> g;
    cout << "广度优先遍历:";
    g.bfTraverse(0);
    cout << endl;
    cout << endl;
    cout << "深度优先遍历:";
    g.dft();
    cout << endl;
    cout << endl;
    cout << "领接矩阵为:" << endl;
    g.print();
}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值