有向图删除边得到有向无环图

通过DFS判断有向图是否存在环,若存在则删除环中任意一条边。遍历未访问节点,访问过程中若遇到已访问节点则表明存在环,删除该边。整个DFS完成后,图变为有向无环图。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

要求

给定用邻接表表示的有向图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 << 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值