Advertisement
Guest User

Untitled

a guest
Oct 22nd, 2018
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.25 KB | None | 0 0
  1. //#define _REAL_DEBUG_
  2. #include <fstream>
  3. #include <string>
  4. #include <vector>
  5. #include <cstdio>
  6. #include <cstring>
  7. #include <algorithm>
  8. #include <cassert>
  9.  
  10. using namespace std;
  11.  
  12. #ifdef _REAL_DEBUG_
  13. ifstream cin("../10-lab-matching/input.txt");
  14. ofstream cout("../10-lab-matching/output.txt");
  15. #else
  16. string file_name = "vertexcover";
  17. ifstream cin(file_name + ".in");
  18. ofstream cout(file_name + ".out");
  19. #endif
  20.  
  21. const int inf = int(2e9), max_n = 4000;
  22.  
  23. // lr-graph
  24. int size_left, size_right;
  25. int to_norm[2][max_n];
  26. vector<int> gl[max_n];
  27. //
  28.  
  29.  
  30. //normal-graph
  31. int cnt_norm;
  32. bool is_left[max_n * 2];
  33. int to_lr[max_n * 2];
  34. vector<int> g[max_n * 2];
  35. int match_to_left[max_n * 2];
  36. bool is_match[max_n * 2];
  37. bool is_exist[max_n * 2][max_n * 2];
  38. //
  39.  
  40. bool used[max_n * 2];
  41. bool is_coved_left[max_n * 2];
  42. vector<int> res_right;
  43. vector<int> res_left;
  44.  
  45. void dfs(int v, bool is_right) {
  46.     if (is_right) {
  47.         res_right.push_back(to_lr[v]);
  48.         is_coved_left[match_to_left[v]] = true;
  49.     }
  50.     for(auto to: g[v]) {
  51.         if(!used[to]) {
  52.             used[to] = true;
  53.             dfs(to, is_right ^ 1);
  54.         }
  55.     }
  56.     return;
  57. }
  58.  
  59.  
  60. int main() {
  61.     ios_base::sync_with_stdio(false);
  62.     cin.tie(NULL);
  63.  
  64.     cin >> size_left >> size_right;
  65.     // left part: init convert array
  66.     for (int i = 0; i < size_left; ++i) {
  67.         is_left[cnt_norm] = true;
  68.         to_lr[cnt_norm] = i;
  69.         to_norm[1][i] = cnt_norm++;
  70.     }
  71.     // right part: init convert array
  72.     for (int i = 0; i < size_right; ++i) {
  73.         is_left[cnt_norm] = false;
  74.         to_lr[cnt_norm] = i;
  75.         to_norm[0][i] = cnt_norm++;
  76.     }
  77.  
  78.     // read graph
  79.     for (int i = 0, cnt_v; i < size_left; ++i) {
  80.         cin >> cnt_v;
  81.         for (int j = 0, v; j < cnt_v; ++j) {
  82.             cin >> v; --v;
  83.             gl[i].push_back(v);
  84.         }
  85.     }
  86.     // read matching
  87.     for (int i = 0, vr, l, r; i < size_left; ++i) {
  88.         cin >> vr; --vr;
  89.         if (vr != -1) {
  90.             r = to_norm[0][vr];
  91.             l = to_norm[1][i];
  92.             g[r].push_back(l);
  93.             is_exist[l][r] = true;
  94.             is_match[l] = is_match[r] = true;
  95.             match_to_left[r] = l;
  96.         }
  97.     }
  98.     // init normal gragh
  99.     for (int i = 0, l, r; i < size_left; ++i) {
  100.         for (auto vr: gl[i]) {
  101.             r = to_norm[0][vr];
  102.             l = to_norm[1][i];
  103.             if(!is_exist[l][r]) {
  104.                 g[l].push_back(r);
  105.             }
  106.         }
  107.     }
  108.  
  109.     // count right vertex
  110.     for (int i = 0, v; i < size_left; ++i) {
  111.         v = to_norm[1][i];
  112.         if(!is_match[v] && !used[v]) {
  113.             dfs(v, false);
  114.         }
  115.     }
  116.  
  117.     //count left vertex
  118.     for (int i = 0, v; i < size_left; ++i) {
  119.         v = to_norm[1][i];
  120.         if(is_match[v] && !is_coved_left[v]) {
  121.             res_left.push_back(to_lr[v]);
  122.         }
  123.     }
  124.  
  125.     // write result
  126.     sort(res_left.begin(), res_left.end());
  127.     sort(res_right.begin(), res_right.end());
  128.  
  129.     cout << res_left.size() + res_right.size() << endl;
  130.     cout << res_left.size() << " ";
  131.     for (auto i: res_left) cout << i + 1 << " ";
  132.     cout << endl;
  133.     cout << res_right.size() << " ";
  134.     for (auto i: res_right) cout << i + 1 << " ";
  135.  
  136.     return 0;
  137. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement