hdu 逃生
第一题是拓扑排序,不是按照字典序最小输出,而是要使较小的数排在最前面。。赛后弄了好久,才比较明白,我一直以为 反向建图,i从1到n,开始深搜dfs( i ),对i点的边,由小到大继续搜一下,同时标记搜过的数,搜过之后就不再搜,搜到底之后ans[cnt++] = u;这样顺序输出就是答案,后来经过超哥指点,才明白深搜贪心是错的。只有 反向建图,用优先队列把较大的数尽量排在前面,然后反序输出才是正解。。
1 #include2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 10 using namespace std; 11 12 #define mnx 104000 13 #define ll long long 14 #define inf 0x3f3f3f3f 15 #define lson l, m, rt << 1 16 #define rson m+1, r, rt << 1 | 1 17 18 vector vet[mnx]; 19 int cnt, ans[mnx], vis[mnx]; 20 int main(){ 21 int cas; 22 scanf( "%d", &cas ); 23 while( cas-- ){ 24 for( int i = 0; i < mnx; i++ ){ 25 vet[i].clear(); 26 } 27 memset( vis, 0, sizeof(vis) ); 28 cnt = 0; 29 int n, m; 30 scanf( "%d%d", &n, &m ); 31 for( int i = 0; i < m; i++ ){ 32 int u, v; 33 scanf( "%d%d", &u, &v ); 34 vis[u]++; 35 vet[v].push_back( u ); 36 } 37 priority_queue que; 38 for( int i = 1; i <= n; i++ ){ 39 if( !vis[i] ) que.push( i ); 40 } 41 while( !que.empty() ){ 42 int u = que.top(); que.pop(); 43 for( int i = 0; i < vet[u].size(); i++ ){ 44 vis[vet[u][i]]--; 45 if( vis[vet[u][i]] == 0 ){ 46 que.push( vet[u][i] ); 47 } 48 } 49 ans[cnt++] = u; 50 } 51 for( int i = cnt-1; i >= 0; i-- ){ 52 if( i == 0 ){ 53 cout< <