题意:
解法:
容易想到优先队列拓扑排序.
但是这题需要反向建图+ 优先队列拓扑排序, 原因如下:
正向优先队列拓扑排序每次取当前字典序最小的点, 但不一定是全局最小:
例如一个特别大的点指向特别小点, 就会导致这个小点更晚出队赋值, 最后字典序变大.
因此需要反向建图, 优先取字典序大的点构造序列.
code:
# include <bits/stdc++.h>
# define int long long
# define ll long long
# define ull unsigned long long
# define ST ( x) x. begin ( )
# define ED ( x) x. end ( )
# define RST ( x) x. rbegin ( )
# define RED ( x) x. end ( )
# define CL ( x) x. clear ( ) ;
# define all ( a, n) a+ 1 , a+ 1 + n
# define ff ( i, n) for ( ll i= 1 ; i<= n; i++ )
# define rff ( i, n) for ( ll i= n; i>= 1 ; i-- )
# define fff ( i, n) for ( ll i= 0 ; i< n; i++ )
# define rfff ( i, n) for ( ll i= n- 1 ; i>= 0 ; i-- )
# define SC ( x) scanf ( "%s" , x)
# define SL ( x) strlen ( x)
# define pss ( a) push_back ( a)
# define ps ( a) push ( a)
# define SZ ( x) ( int ) x. size ( )
# define pee puts ( "" ) ;
# define eee putchar ( ' ' ) ;
# define re readdd ( )
# define pr ( a) printtt ( a)
int readdd ( ) { int x= 0 , f= 1 ; char c= getchar ( ) ;
while ( ! isdigit ( c) && c!= '-' ) c= getchar ( ) ;
if ( c== '-' ) f= - 1 , c= getchar ( ) ;
while ( isdigit ( c) ) x= x* 10 + c- '0' , c= getchar ( ) ;
return f* x; }
void printtt ( int x) { if ( x< 0 ) putchar ( '-' ) , x= - x;
if ( x>= 10 ) printtt ( x/ 10 ) ; putchar ( x% 10 + '0' ) ; }
int gcd ( int a, int b) { return b== 0 ? a: gcd ( b, a% b) ; }
int ppow ( int a, int b, int mod) { a%= mod;
int ans= 1 % mod; while ( b) { if ( b& 1 ) ans= ( long long ) ans* a% mod;
a= ( long long ) a* a% mod; b>>= 1 ; } return ans; }
bool addd ( int a, int b) { return a> b; }
int lowbit ( int x) { return x& - x; }
const int dx[ 4 ] = { 0 , 0 , 1 , - 1 } ;
const int dy[ 4 ] = { 1 , - 1 , 0 , 0 } ;
bool isdigit ( char c) { return c>= '0' && c<= '9' ; }
bool Isprime ( int x) {
for ( int i= 2 ; i* i<= x; i++ ) if ( x% i== 0 ) return 0 ;
return 1 ;
}
void ac ( int x) { if ( x) puts ( "YES" ) ; else puts ( "NO" ) ; }
# define VE vector< int >
# define PI pair< int , int >
using namespace std;
const int mod= 1e9 + 7 ;
const int maxm= 2e6 + 5 ;
vector< int > g[ maxm] ;
int ans[ maxm] ;
int d[ maxm] ;
int n, m;
void topo ( ) {
priority_queue< int , vector< int > , less< int > > q;
ff ( i, n) {
if ( ! d[ i] ) {
q. push ( i) ;
}
}
int now= n;
while ( q. size ( ) ) {
int x= q. top ( ) ; q. pop ( ) ;
ans[ x] = now-- ;
for ( int v: g[ x] ) {
if ( -- d[ v] == 0 ) {
q. push ( v) ;
}
}
}
}
void solve ( ) {
n= re, m= re;
ff ( i, m) {
int x= re, y= re;
g[ y] . pss ( x) ;
d[ x] ++ ;
}
topo ( ) ;
for ( int i= 1 ; i<= n; i++ ) {
pr ( ans[ i] ) ; eee;
}
pee;
}
void Main ( ) {
# ifdef MULTI_CASE
int T; cin>> T; while ( T-- )
# endif
solve ( ) ;
}
void Init ( ) {
# ifdef SYNC_OFF
ios:: sync_with_stdio ( 0 ) ; cin. tie ( 0 ) ;
# endif
# ifndef ONLINE_JUDGE
freopen ( "../in.txt" , "r" , stdin ) ;
freopen ( "../out.txt" , "w" , stdout ) ;
# endif
}
signed main ( ) {
Init ( ) ;
Main ( ) ;
return 0 ;
}