拓扑排序模板

本文介绍了两种实现拓扑排序的方法:一种使用深度优先搜索(DFS),另一种使用广度优先搜索(BFS)。通过这两种方法,文章详细阐述了如何检测图中是否存在环,并提供了具体的算法实现细节。

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

/*==================================================*\
| topoSort -- 使用dfs			
| 使用dfs难以保证topo结果为最小的顺序
\*==================================================*/
int n, m, a, b, G[maxn][maxn];  
int c[maxn];					//0 1 -1 未访问过 已访问过全部孩子 正在访问
int topo[maxn], t;				//保存结果

bool dfs(int u) {
    c[u] = -1;									//标记正在访问
    for(int v = 1; v <= n; ++v) {
        if(G[u][v]) {
            if(c[v] < 0) return 0;
            else if(!c[v] && !dfs(v)) return 0;	//递归访问相关点,返回有环的情况 
        }
    }
    c[u] = 1;									//访问结束
    topo[t--] = u;								//记录结果
    return 1;
}
bool topoSort() {
    t = n; met(c, 0);
    for(int u = 1; u <= n; ++u) if(!c[u]) {
        if(!dfs(u)) return 0;
    }
    return 1;
}
/*==================================================*\
| topoSort -- 使用bfs		
\*==================================================*/
vector<int> G[maxn];
int in[maxn];           //入度
int topo[maxn], t;

bool topoSort() {
    priority_queue<int, vector<int>, greater<int> > q; t = 0;	//优先队列保证最小序列
    for(int i = 1; i <= n; ++i) {
        if(in[i] == 0) q.push(i);
    }

    int cnt = 0;
    while(!q.empty()) {
        int u = q.top(); q.pop();
        topo[t++] = u; ++cnt;
        for(int v = 0; v < G[u].size(); ++v) {
            if(--in[G[u][v]] == 0) q.push(G[u][v]);				//找入度为0的边入队
        }
    }

    if(cnt != n) return 0;										//有环
    return 1;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值