#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();
}
}
拓扑排序的两种实现--基于dfs和基于入度
原文作者:拓扑排序
原文地址: https://blog.csdn.net/qq_24667639/article/details/46967929
本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
原文地址: https://blog.csdn.net/qq_24667639/article/details/46967929
本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。