抽象数据类型
操作接口:图支持的操作接口分为边和顶点两类
Graph模板类
typedef enum { UNDISCOVERED, DISCOVERED, VISITED } VStatus; //顶点状态
typedef enum { UNDETERMINED, TREE, CROSS, FORWARD, BACKWARD } EStatus; //边状态
template <typename Tv, typename Te> //顶点类型、边类型
class Graph { //图Graph模板类
private:
void reset() { //所有顶点、边的辅助信息复位
for (int i = 0; i < n; i++) { //所有顶点的
status(i) = UNDISCOVERED; dTime(i) = fTime(i) = -1; //状态,时间标签
parent(i) = -1; priority(i) = INT_MAX; //(在遍历树中的)父节点,优先级数
for (int j = 0; j < n; j++) //所有边的
if (exists(i, j)) status(i, j) = UNDETERMINED; //状态
}
}
void BFS(int, int&); //(连通域)广度优先搜索算法
void DFS(int, int&); //(连通域)深度优先搜索算法
void BCC(int, int&, Stack<int>&); //(连通域)基亍DFS的双连通分量分解算法
bool TSort(int, int&, Stack<Tv>*); //(连通域)基亍DFS的拓扑排序算法
template <typename PU> void PFS(int, PU); //(连通域)优先级搜索框架
public:
// 顶点
int n; //顶点总数
virtual int insert(Tv const&) = 0;
virtual Tv remove(int) = 0; //删除顶点及其关联边,返回该顶点信息
virtual Tv& vertex(int) = 0; //顶点v的数据(该顶点的确存在)
virtual int inDegree(int) = 0; //顶点v的入度(该顶点的确存在)
virtual int outDegree(int) = 0; //顶点v的出