Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define _CRT_SECURE_NO_WARNINGS
- #include <bits/stdc++.h>
- using namespace std;
- typedef long long ll;
- typedef unsigned long long ull;
- #define all(x) x.begin(), x.end()
- #define rall(x) x.rbegin(), x.rend()
- //#define endl '\n'
- #define boostIO() ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
- ll gcd(ll a, ll b) { return (b == 0 ? a : gcd(b, a % b)); }
- int n;
- vector<int> points;
- vector <multiset<int>> g;
- vector<int> path(int v) {
- stack<int> s;
- vector<int> ans;
- s.push(v);
- while (!s.empty()) {
- int w = s.top();
- bool found_edge = false;
- vector<int> ers;
- for (auto u : g[w]) {
- s.push(u);
- ers.push_back(u);
- found_edge = true;
- break;
- }
- for(auto u : ers)
- g[w].erase(g[w].find(u));
- if (!found_edge) {
- s.pop();
- ans.push_back(w);
- }
- }
- return ans;
- }
- signed main() {
- int start;
- cin >> n >> start;
- --start;
- points.push_back(start);
- vector<vector<int>> e(n, vector<int>(3));
- for (int i = 0; i < n; ++i) {
- int a, b, c;
- cin >> a >> b >> c;
- --a, --b;
- e[i] = { a, b, c };
- points.push_back(a);
- points.push_back(b);
- }
- sort(all(points));
- points.resize(unique(all(points)) - points.begin());
- start = lower_bound(all(points), start) - points.begin();
- g.resize(points.size());
- vector<map<int, vector<int>>> q(points.size());
- for (int i = 0; i < n; ++i) {
- e[i][0] = lower_bound(all(points), e[i][0]) - points.begin();
- e[i][1] = lower_bound(all(points), e[i][1]) - points.begin();
- if (e[i][2] == 1) {
- g[e[i][0]].insert(e[i][1]);
- q[e[i][0]][e[i][1]].push_back(i);
- }
- }
- auto p = path(start);
- reverse(all(p));
- vector<int> ans1, ans;
- //for (auto& x : p) cout << x + 1 << " ";
- for (int i = 0; i < p.size() - 1; ++i) {
- if (q[p[i]][p[i + 1]].size() == 0) {
- cout << "No";
- return 0;
- }
- ans1.push_back(q[p[i]][p[i + 1]].back());
- q[p[i]][p[i + 1]].pop_back();
- }
- for (int i = 0; i < e.size(); ++i) {
- if (e[i][2] == 0 && e[i][0] != start) ans.push_back(i);
- }
- int t = start;
- int it = 0;
- while (it < ans1.size() && t == start) {
- ans.push_back(ans1[it]);
- t = e[ans.back()][1];
- ++it;
- }
- for (int i = 0; i < e.size(); ++i) {
- if (e[i][2] == 0 && e[i][0] == start) ans.push_back(i);
- }
- for (int i = it; i < ans1.size(); ++i) {
- ans.push_back(ans1[i]);
- }
- if (ans.size() != n) {
- cout << "No";
- return 0;
- }
- for (int i = 0; i < n; ++i) {
- auto& cur = e[ans[i]];
- if (cur[2] == 0) {
- if (start != cur[0]) continue;
- cout << "No";
- return 0;
- }
- else {
- if (start != cur[0]) {
- cout << "No";
- return 0;
- }
- start = cur[1];
- }
- }
- cout << "Yes\n";
- for (auto& x : ans) cout << x + 1 << " ";
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement