Implementação de DFS de classificação topológica

Usado para determinar a relação do precursor.
Por exemplo, a <b, c <d, c <b pode determinar
a <c <b <d
ou
c <a <b <d

Se não houver anel, deve haver tal cadeia, mas se houver um anel, a classificação topológica não pode ser realizada. Neste exemplo, a> b e b> a não podem ser alcançados;

Use dfs para

Código falso

//判断是否有环(true 没有; false 有)
bool dfs(u) {
	本趟节点标记;
	for(遍历以u为入弧的定点){
			if(是本趟节点)return false;
			else if(如果没访问过) {
				if(子节点有环)return false;
			}
		}
		//表示这个节点的到底都没有环
		倒着将沿途的节点加入拓扑队列    //因为这是递归的返回,就是到头回来的过程
		return true;
	}
bool topoSort(){
	for(遍历节点){
		if(没访问过){
			if(有环) return false;
		}
	}
	//所有节点都没环
	return true;
}

两句if 可以合成为 
if(没访问过 && 有环)return false;


#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;

const int maxn = 100;
int c[maxn];
int topo[maxn], t, n;
int G[maxn][maxn];


bool dfs(int u)
{
    
    
	c[u] = -1;
	for(int v = 0; v < n; v++)
	{
    
    
		if(G[u][v])
		{
    
    
			if(c[v] < 0)
				return false;
			else if(!c[v] && !dfs(v))
                return false;
		}
	}
	c[u] = 1;
	topo[--t] = u;
	return true;
}
bool topoSort()
{
    
    
	t = n;
	memset(c,0,sizeof(c));
	for(int u = 0; u < n; u++){
    
    
		if(!c[u] && !dfs(u))
            return false;
	}
	return true;
}


int main()
{
    
    
    char ch[100] = {
    
    'a', 'b', 'c', 'd'};
    n = 4;
    G[0][1] = 1;
    //G[1][0] = 1;
    G[2][1] = 1;
    G[3][2] = 1;
    if(!topoSort()){
    
    
        printf("无法拓扑排序\n");
        return 0;
    }
    for(int i = 0; i < 4; i++){
    
    
        printf("%c ", ch[topo[i]]);
    }
    printf("\n");
}

A parte mais interessante desse código é usar c [u] = -1 para determinar se há um loop no resultado dessa viagem.
Diferente da matriz de sinalização dfs clássica, dois valores são usados ​​para representar significados diferentes.
c [u] = 0: Indica que cada visita
c [u] = 1: Indica que o nó acima do vértice foi visitado
c [u] = -1: Indica se o dfs foi visitado neste momento

Acho que você gosta

Origin blog.csdn.net/fuzekun/article/details/106744046
Recomendado
Clasificación