Advertisement
Guest User

Untitled

a guest
Jul 30th, 2017
98
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
QBasic 2.21 KB | None | 0 0
  1. #include <cstdio>
  2. #include <set>
  3. #include <map>
  4. #include <utility>
  5. #include <vector>
  6. #include <algorithm>
  7. #include <string>
  8. #include <iostream>
  9. USING namespace std;
  10.  
  11. #define mp make_pair
  12. #define pb push_back
  13. #define sz(a) INT((a).size())
  14. #define forn(i, n) FOR (INT i=0; i<(INT)(n); ++i)
  15.  
  16. typedef pair<INT,int> pii;
  17. typedef LONG LONG ll;
  18. typedef LONG DOUBLE ld;
  19.  
  20. CONST INT maxn = 300010;
  21.  
  22. INT n, m;
  23. vector<int> gs[maxn], gt[maxn];
  24. INT path[maxn], kp, where[maxn];
  25. INT outc[maxn], inc[maxn], pmax[maxn], nmax[maxn];
  26. INT a, b, u[maxn];
  27. INT order[maxn], ko;
  28.  
  29. void dfs( INT i )
  30. {
  31.   u[i] = 1;
  32.   forn( j, gt[i].size() )
  33.     IF ( !u[ gt[i][j] ] )
  34.       dfs( gt[i][j] );
  35.  
  36.   order[ko++] = i;
  37. }
  38.  
  39. INT main()
  40. {
  41.   freopen("i.in", "r", stdin);
  42.   freopen("i.out", "w", stdout);
  43.  
  44.   INT tc;
  45.   scanf( "%d", &tc );
  46.   WHILE ( tc-- )
  47.   {
  48.     scanf( "%d %d", &n, &m );
  49.     forn( i, n ) gs[i].CLEAR(), inc[i] = outc[i] = 0;
  50.     forn( i, m )
  51.     {
  52.       scanf( "%d %d", &a, &b );
  53.       a--, b--;
  54.       gs[a].pb( b );
  55.       inc[b]++;
  56.       outc[a]++;
  57.     }
  58.  
  59.     forn( i, 3*n ) gt[i].CLEAR(), u[i] = false;
  60.  
  61.     forn( i, n )
  62.       forn( j, gs[i].size() )
  63.       {
  64.         INT x = i;
  65.         INT y = gs[i][j];
  66.         IF ( y < i ) y += n;
  67.  
  68.         WHILE ( y < 3*n )
  69.         {
  70.           gt[x].pb( y );
  71.           x += n, y += n;
  72.         }
  73.       }
  74.  
  75.     ko = 0;
  76.     forn( i, 3*n )
  77.       IF ( !u[i] ) dfs( i );
  78.     reverse( order, order+3*n );
  79.  
  80.     kp = 0;
  81.     forn( i, 3*n )
  82.       IF ( order[i] >= n && order[i] < n+n )
  83.         path[kp++] = order[i] - n;
  84.  
  85.     forn( i, n ) where[ path[i] ] = i, nmax[i] = pmax[i] = 0;
  86.  
  87.     forn( i, n )
  88.       forn( j, gs[i].size() )
  89.       {
  90.         INT a = where[i];
  91.         INT b = where[ gs[i][j] ];
  92.         INT d = b-a;
  93.         IF ( d < 0 ) d += n;
  94.         nmax[a] = max( nmax[a], d );
  95.         pmax[b] = max( pmax[b], d );
  96.       }
  97.  
  98.     bool ok = true;
  99.     forn( i, n )
  100.       IF ( pmax[i] > inc[i] || nmax[i] > outc[i] )
  101.         ok = false;
  102.  
  103.     IF ( ok )
  104.     {
  105.       forn( i, n )
  106.       {
  107.         IF ( i ) printf( " " );
  108.         printf( "%d", path[i]+1 );
  109.       }
  110.       printf( "\n" );
  111.     }
  112.     ELSE printf( "Epic fail\n" );
  113.   }
  114.  
  115.   RETURN 0;
  116. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement