zoukankan      html  css  js  c++  java
  • CSA Round #56

    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

     

    要么优秀要么生锈
  • 相关阅读:
    BZOJ3697: 采药人的路径
    解题:WC 2007 石头剪刀布
    解题:CQOI 2017 老C的方块
    解题:洛谷4314 CPU监控
    解题:CQOI 2017 老C的任务
    解题:CF1009 Dominant Indices
    解题:CF570D Tree Requests
    解题:APIO 2012 派遣
    解题:ZJOI 2015 幻想乡战略游戏
    解题:洛谷4178 Tree
  • 原文地址:https://www.cnblogs.com/Superwalker/p/7852507.html
Copyright © 2011-2022 走看看