20、邻接矩阵:BFS实现拓扑排序

本文档介绍了如何使用C++模板设计邻接矩阵图抽象数据类型,并实现基于广度优先搜索的拓扑排序算法。通过实例展示了图的创建、操作和排序过程,适用于有向图和无向图的处理。

问题描述 :

目的:使用C++模板设计并逐步完善图的邻接矩阵抽象数据类型(ADT)。

内容:(1)请参照图的邻接矩阵模板类原型,设计并逐步完善图的邻接矩阵ADT。(由于该环境目前仅支持单文件的编译,故将所有内容都集中在一个源文件内。在实际的设计中,推荐将抽象类及对应的派生类分别放在单独的头文件中。)

(2)设计并实现一个算法,基于广度优先搜索的思想,对于给定的有向图(网),实现拓扑排序。如排序成功,返回true;否则返回false。无论排序是否成功,都请给出最终的排序结果。图的存储结构采用邻接矩阵。将其加入到ADT中。

 

注意:DG(有向图), DN(有向网), UDG(无向图), UDN(无向网)

解题代码:

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <string>
#include <vector>
#include <queue>
#include <sstream>
#include <stack>
#include <map>
#include <ctime>
#include <array>
#include <set>
using namespace std;

template <class TypeOfVer, class TypeOfEdge>//节点数值,边数值
class adjmatrix_graph {
private:
    int Vers;        //顶点(节点)数 
    int Edges;       //边数 
    //存放邻接矩阵(TypeOfEdge表示顶点关系类型。对于无权图,用1或0,表示相邻否;对于带权图,则为权值类型) 

    vector<vector<TypeOfEdge> >edge;//邻接矩阵
    TypeOfEdge noEdge;  //邻接矩阵中的∞的表示值

    vector<TypeOfVer> ver;    //存放结点值 

    string GraphKind;   //图的种类标志 

    bool have_dir = false, have_w = false;//图类型参数

    vector<TypeOfVer> dfs_lis;
    vector<bool> vis_lis;
    //DFS遍历(递归部分)
    bool DFS(int t) 
    {
        int i, j;
        vis_lis[t] = true;
        dfs_lis.push_back(ver[t]);
        for (i = 0; i < Vers; i++)
            if (edge[t][i] != noEdge)
                if (vis_lis[i] == false)
                    DFS(i);
        return 1;
    }
public:
    adjmatrix_graph()
    {
        Vers = 0;
        Edges = 0;
        edge.clear();
        ver.clear();
        noEdge = 0;
    }
    ~adjmatrix_graph()
    {
        ;
    }
    //全自动输入 true is need 无边标记
    bool Auto_input(bool need_emp)//true is need 无边标记
    {
        //DG(有向图), DN(有向网), UDG(无向图), UDN(无向网)
        /*第一行:图的类型  DN UDN
        第二行:结点数
        第三行:结点集
        第四行:无边标记
        第五行:边数
        第六行:边集
        第七行:权集*/

        /*第一行:图的类型  DG UDG
        第二行:结点数 
        第三行:结点集
        第四行:边数
        第五行:边集*/
        cin >> GraphKind;//图的类型 
        cin >> Vers;//结点数
        ver.resize(Vers);
        for (int i = 0; i < Vers; i++)//结点集
            cin >> ver[i];

        if (need_emp || GraphKind == "DN")
            cin >> noE
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值