标签:拓扑排序
#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];
struct node{
int n;
int t;
bool operator < (const node& a)const {
return t > a.t;
}
};
node et[100];
int tm = 0;
/*
基于dfs的拓扑排序,利用dfs中的完成时间戳,完成时间戳越大越放在前面
*/
bool dfs(int x){
tm ++;
vis[x] = 1;
int si = vec[x].size();
for(int i = 0;i < si;i++){
int v = vec[x][i];
if(vis[v] == 1){
return false;
}
else if(vis[v] == 0){
if(!dfs(v)){
return false;
}
}
}
tm ++;
et[x].t = tm;
vis[x] = 2;
}
int topu_DFS(){
tm = 0;
memset(vis,0,sizeof(vis));
for(int i = 0;i < n;i++){
et[i].n = i;
}
for(int i = 0;i < n;i++){
if(!vis[i]){
if(!dfs(i)){
printf("no order!!!!\n");
}
}
}
sort(et,et+n);
for(int i = 0;i < n;i++){
printf("%d ",et[i].n);
}
}
/*
基于入度的拓扑排序
*/
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();
}
} 版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:拓扑排序
原文地址:http://blog.csdn.net/qq_24667639/article/details/46967929