Georgiy031

Untitled

Nov 22nd, 2020
548
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.08 KB | None | 0 0
  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <bits/stdc++.h>
  3. using namespace std;
  4. typedef long long ll;
  5. typedef unsigned long long ull;
  6. #define all(x) x.begin(), x.end()
  7. #define rall(x) x.rbegin(), x.rend()
  8. //#define endl '\n'
  9. #define boostIO() ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
  10. ll gcd(ll a, ll b) { return (b == 0 ? a : gcd(b, a % b)); }
  11.  
  12. int n;
  13. vector <multiset<int>> g;
  14. vector<int> path(int v) {
  15.     stack<int> s;
  16.     vector<int> ans;
  17.     s.push(v);
  18.     while (!s.empty()) {
  19.         int w = s.top();
  20.         bool found_edge = false;
  21.         for (int u = 0; u < n; ++u) {
  22.             if (g[w].count(u)) {
  23.                 s.push(u);
  24.                 g[w].erase(g[w].find(u));
  25.                 found_edge = true;
  26.                 break;
  27.             }
  28.         }
  29.         if (!found_edge) {
  30.             s.pop();
  31.             ans.push_back(w);
  32.         }
  33.     }
  34.     return ans;
  35. }
  36.  
  37. signed main() {
  38.     int start;
  39.     cin >> n >> start;
  40.     --start;
  41.     g.resize(n);
  42.     vector<map<int, vector<int>>> q(n);
  43.     vector<vector<int>> e(n, vector<int>(3));
  44.     for (int i = 0; i < n; ++i) {
  45.         int a, b, c;
  46.         cin >> a >> b >> c;
  47.         --a, --b;
  48.         e[i] = { a, b, c };
  49.         if (c == 1) {
  50.             g[a].insert(b);
  51.             q[a][b].push_back(i);
  52.         }
  53.     }
  54.     auto p = path(start);
  55.     reverse(all(p));
  56.     vector<int> ans1, ans;
  57.     //for (auto& x : p) cout << x + 1 << " ";
  58.     for (int i = 0; i < p.size() - 1; ++i) {
  59.         if (q[p[i]][p[i + 1]].size() == 0) {
  60.             cout << "No";
  61.             return 0;
  62.         }
  63.         ans1.push_back(q[p[i]][p[i + 1]].back());
  64.         q[p[i]][p[i + 1]].pop_back();
  65.     }
  66.     for (int i = 0; i < e.size(); ++i) {
  67.         if (e[i][2] == 0 && e[i][0] != start) ans.push_back(i);
  68.     }
  69.     int t = start;
  70.     int it = 0;
  71.     while (it < ans1.size() && t == start) {
  72.         ans.push_back(ans1[it]);
  73.         t = e[ans.back()][1];
  74.         ++it;
  75.     }
  76.     for (int i = 0; i < e.size(); ++i) {
  77.         if (e[i][2] == 0 && e[i][0] == start) ans.push_back(i);
  78.     }
  79.     for (int i = it; i < ans1.size(); ++i) {
  80.         ans.push_back(ans1[i]);
  81.     }
  82.     if (ans.size() != n) {
  83.         cout << "No";
  84.         return 0;
  85.     }
  86.     for (int i = 0; i < n; ++i) {
  87.         auto& cur = e[ans[i]];
  88.         if (cur[2] == 0) {
  89.             if (start != cur[0]) continue;
  90.             cout << "No";
  91.             return 0;
  92.         }
  93.         else {
  94.             if (start != cur[0]) {
  95.                 cout << "No";
  96.                 return 0;
  97.             }
  98.             start = cur[1];
  99.         }
  100.     }
  101.     cout << "Yes\n";
  102.     for (auto& x : ans) cout << x + 1 << " ";
  103. }
  104.  
Advertisement
Add Comment
Please, Sign In to add comment