CSA Round #56
阿新 • • 發佈:2017-11-17
std union tin display tdi argv != nio clas
C.Find Path Union
題意
給一顆n個節點數,給出每個節點所連接的點,以及連接的順序,問能不能找到一種合適的連接方案使得若有節點的連接順序都滿足
分析
其實就是模擬題, 構造取的這個過程,每次取的時候, 考慮取得這個點,順序是否滿足,用一個隊列模擬這個一個一個取的過程,若最後都按照滿足的順序取完則可以,反之則無解
#include <bits/stdc++.h> using namespace std; int main(int argc, char *argv[]) { cin.sync_with_stdio(false); int n; cinView Code>> n; vector<pair<int, int>> vec; vector<vector<int>> g(n + 1); set<pair<int, int>> se; for (int u = 1; u <= n; u++) { int l; cin >> l; while (l--) { int v; cin >> v; g[u].push_back(v); } reverse(g[u].begin(), g[u].end()); } queue<int> q; for (int i = 1; i <= n; i++) { q.push(i); } while (!q.empty()) { int u = q.front(); q.pop(); if (!g[u].empty()) { int v = g[u].back(); if (v == u || g[v].empty() || g[v].back() != u || se.count({u, v})) { continue; } g[v].pop_back(); g[u].pop_back(); se.insert({u, v}); vec.push_back({u, v}); q.push(u); q.push(v); } }for (int i = 1; i <= n; i++) { if (!g[i].empty()) { cout << -1 << endl; return 0; } } for (auto e : vec) { cout << e.first << " " << e.second << endl; } return 0; }
CSA Round #56