标签:img als ever ++ 技术分享 模拟题 col cin space
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; }
标签:img als ever ++ 技术分享 模拟题 col cin space
原文地址:http://www.cnblogs.com/Superwalker/p/7852507.html