要求
给定用邻接表表示的有向图G,从G中删除一些边,将G转化为有向无环图
具体思路
判定是否是有向图可以通过DFS或者拓扑排序来完成,笔者采用的是DFS的方式。具体的思路为:对图进行DFS,在每一个没有被访问的过的结点做DFS的过程中,如果再次访问到了之前访问到的某个结点,则存在环(假如对顶点A做DFS的过程中访问到的结点分别为A->B->C->D->E,那么如果E之后访问到的结点为ABCDE中的任意一个,则存在环,但是要注意的一个问题是,访问的节点必须是没有结束的。如果没有注意到这一点,可能会判定存在环错误而删除错误)。如果检测到存在环,可以任意删除环中的一条边来破坏这个环。当整个DFS的过程完成之后,图中就不会再有环存在了。
完整代码
//anthor:Charon_V
//time:2019/04/25
#include <iostream>
#include <string>
#include <queue>
using namespace std;
#define MAXVEX 10
bool visited[MAXVEX]; //全局数组,记录结点是否已补访问
int visited_1[MAXVEX];//在删除使观察节点的状态
bool x;//x用来判定是否为无环图
typedef struct EdgeNode
{
int adjvex; //邻接点
struct EdgeNode* next; //指向下一条边
}EdgeNode;
typedef struct
{
string data;
EdgeNode* pFirstEdge; //指示第一条边
}VertexNode;
typedef VertexNode AdjList[MAXVEX];//邻接表
typedef struct
{
AdjList adjList; //邻接表
int iVexNum; //顶点个数
int iEdgeNum; //边数
}AdjListGraph;
//由顶点值得到顶点索引
int GetIndexByVertexVal(const AdjListGraph& G, string val)
{
for (int i = 0; i < G.iVexNum; ++i)
{
if (val == G.adjList[i].data)
return i;
}
return -1;
}
//创建有向图
void CreateAdjListGraph(AdjListGraph& G)
{
cout <<