问题描述 :
目的:使用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

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

4989

被折叠的 条评论
为什么被折叠?



