Advertisement
vahook

Mester / "OKTV 2018/19 3. forduló" / 2. Karavánok

Apr 26th, 2020
291
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.48 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3.  
  4. using namespace std;
  5.  
  6. #define MAXN 5000
  7. #define MAXM 100000
  8.  
  9. int N, M;
  10.  
  11. vector<int> pontok[MAXN+1];
  12. vector<int> transz[MAXN+1];
  13. char volte[MAXN+1];
  14. char osszes;
  15.  
  16. int target;
  17. void
  18. dfs(int p)
  19. {
  20.     osszes--;
  21.     volte[p] = target;
  22.     for(const auto k : pontok[p]){
  23.         if(volte[k] != target){
  24.             dfs(k);
  25.         }
  26.     }
  27. }
  28.  
  29. void
  30. dfs2(int p)
  31. {
  32.     volte[p] = 0;
  33.     for(const auto k : transz[p]){
  34.         if(volte[k]){
  35.             dfs2(k);
  36.         }
  37.     }
  38. }
  39.  
  40. int
  41. main()
  42. {
  43.     ios_base::sync_with_stdio(false);
  44.  
  45.     /* Beolv */
  46.     cin >> N >> M;
  47.     osszes = N;
  48.     for(int i = 1; i <= M; i++){
  49.         int a, b;
  50.         cin >> a >> b;
  51.         pontok[a].push_back(b);
  52.         transz[b].push_back(a);
  53.     }
  54.  
  55.     /* Csak arra vagyunk kíváncsiak, hogy ha lenne topologikus sorrendünk,
  56.        akkor melyik lenne az első benne. */
  57.     target = 1;
  58.     int p = 1;
  59.     for(; p <= N; p++){
  60.         if(volte[p]) continue;
  61.         dfs(p);
  62.         if(!osszes)
  63.             break;
  64.     }
  65.  
  66.     /* Ha ez megoldás <=> létezik megoldás */
  67.     osszes = N;
  68.     target = 2;
  69.     dfs(p);
  70.     if(osszes) {
  71.         cout << "-1" << endl;
  72.         return 0;
  73.     }
  74.  
  75.     /* Ha ez megoldás volt, akkor a vele erősen összefüggő komponensben lévők
  76.        is azok. */
  77.     dfs2(p);
  78.  
  79.     /* Kiír */
  80.     for(int i = 1; i <= N; i++){
  81.         if(!volte[i])
  82.             cout << i << " ";
  83.     }
  84.  
  85.     return 0;
  86. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement