拓扑排序+有向无环图(DAG)的检测

参考: 算法导论第三版 p356, 数据结构与算法分析p218, 算法入门经典p110


拓扑排序的两张方法:

1.dfs搜索
2.模拟人工的拓扑
两种方法的效率都是O(V + E)

$$拓扑排序的方法也是有向无环图检测的方法


/*
拓扑排序 dfs搜索 - 邻接表
可以判断一个图是否有环
*/

#include <cstdio>
#include <vector>
#include <stack>
using std::vector;
using std::stack;


const int MAXN = 10;
const int INIT = 0;
const int GRAY = 1; //参考算法导论的染色, GRAY表示一条后向边
const int BLACK = 2;

int visit[MAXN];
int time = 0;
vector<vector<int>>g(MAXN);
stack<int> ans;

bool dfs(int p) // recursion递归
{
    visit[p] = GRAY; //表示正被访问(正在访问它或者它的子孙)的结点
    for (int i = 0; i < g[p].size(); ++i)
    {
        int temp = g[p][i];
        if (visit[temp] == INIT)
        {
            if (dfs(temp) == false)
                return false;
        }
        else if (visit[temp] == GRAY)
        {
		    //GRAY表示一条后向边,代表子孙
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值