1. 程式人生 > >CSA Round #56

CSA Round #56

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;
  cin 
>> 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; }
View Code

CSA Round #56