uva 10305

基本的拓扑排序

#include <iostream> #include <cstring> using namespace std ; const int maxn = 100 + 10 ; bool G[maxn][maxn] ; int c[maxn] ; int arr[maxn] ; int cnt ; bool dfs( int u , int n ) { c[u] = -1 ; for( int v = 1 ; v <= n ; ++v ) if( G[u][v] ) { if( c[v] < 0 ) return false ; else if( ! c[v] && ! dfs( v , n ) ) return false ; } c[u] = 1 ; arr[--cnt] = u ; return true ; } void toposort( int n ) { cnt = n ; for( int i = 1 ; i <= n ; ++i ) if( ! c[i] ) dfs( i , n ) ; return ; } int main() { int n , m ; while( cin >> n >> m ) { if( ! n && ! m ) return 0 ; memset( G , 0 , sizeof( G ) ) ; memset( c , 0 , sizeof( c ) ) ; memset( arr , 0 , sizeof( arr ) ) ; for( int i = 0 ; i < m ; ++i ) { int u , v ; cin >> u >> v ; G[u][v] = true ; } cnt = 0 ; toposort( n ) ; for( int i = 0 ; i < n ; i++ ) if( ! i ) cout << arr[i] ; else cout << " " << arr[i] ; cout << endl ; } return 0 ; }

你可能感兴趣的:(uva 10305)