题意
假设有n个变量,还有m个二元组(u, v),分别表示变量u小于v。那么,所有变量从小大排列起来应该是什么样子的呢?例如,有4个变量a, b, c, d,若已知a < b,c < b,d < c,则这4个变量的排序可能是a < d < c < b。尽管还有其他可能(如d < a < c < b),你只需找出其中一个即可
思路
无环图DAG才存在拓扑排序, 用mrk[]标记三种状态: -1(正在访问), 0(未访问), 1(访问过且已返回)
如果递归dfs遇到-1说明是有环图, 则不存在拓扑排序AC代码
#include#include #include using namespace std;const int maxn = 100 + 50;int dag[maxn][maxn];int t[maxn], mrk[maxn];int n, m, tp;bool dfs( int x ){ mrk[x] = -1; for( int i = 1; i <= n; i++ ){ if( dag[x][i] ){ if( mrk[i] == -1 ) return false; else if( !mrk[i] && !dfs(i) ) return false; } } mrk[x] = 1; t[--tp] = x; return true;}bool topo(){ tp = n; for( int i = 1; i <= n; i++ ) if( !mrk[i] && !dfs(i) ) return false; return true;}int main(){ int a, b; while( scanf("%d%d",&n, &m) == 2 && n ){ memset(dag, 0, sizeof(dag)); memset(mrk, 0, sizeof(mrk)); while( m-- ){ scanf("%d%d",&a,&b); dag[a][b] = 1; } topo(); for( int i = 0; i < n; i++ ){ if( i != 0 ) putchar(' '); printf("%d",t[i]); } putchar('\n'); } return 0;}