拓扑排序的两种实现--基于dfs和基于入度

#include <cstdio>
#include <iostream>
#include <vector>
#include <cstring>
#include <algorithm>
#include <queue>
#include <stack>

using namespace std;
int n;
vector<int> vec[100];

int vis[100];

node et[100];
int tm = 0;
/*
	基于dfs的拓扑排序,利用dfs中的完成时间戳,完成时间戳越大越放在前面 
*/
queue<int> que;
int topu_dfs(int s){
    vec[s] = 1;
    int si = vec[s].size(); 
    for(int i = 0;i < si;i++){
        int v = vec[s][i];
        if(vec[v] == 1){
            return false;
        }
        if(vec[v] == 0){
            dfs(v);
        }
    }
    vec[s] = 2;
    que.push(s);
    return true;
}
int topu(){
    memset(vis,0,sizeof(vis));
    for(int i = 0;i < n;i++){
        if(!vis[i]){
            if(!dfs(i)){
                return false;
            }
        }
    }
    return true;
}

/*
	基于入度的拓扑排序 
*/ 
int d[100];
int topu_rudu(){
	stack<int> st;
	
	for(int i = 0;i < n;i++){
		d[i] = vec[i].size();
		if(d[i] == 0){
			st.push(i);
		}
	}
	queue<int> que;
	
	while(!st.empty()){
		int u = st.top();
		st.pop();
		que.push(u);	
		int si = vec[u].size();
		for(int i = 0;i < si;i++){
			int v = vec[u][i];
			d[v]--;
			if(d[v] == 0){
				st.push(v);
			}
		}
	}
	if(que.size()!=n){
		printf("no order!!!\n");
	}
	else{
		while(!que.empty()){
			printf("%d ",que.front());
			que.pop();
		}
	}
} 
int main(){
	while(cin >> n){
		int m;
		cin >> m;
		for(int i = 0;i < m;i++){
			int x,y;
			
			cin >> x >> y;
			vec[x].push_back(y);	
		}
		topu_rudu();
		topu_DFS();
		
	}
} 

    原文作者:拓扑排序
    原文地址: https://blog.csdn.net/qq_24667639/article/details/46967929
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞