Advertisement
Guest User

Untitled

a guest
Dec 18th, 2017
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.63 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. //template<typename T>
  6. //void print_vector(vector<T> vec) { for (auto &t : vec) cout << t << " "; cout << endl; }
  7.  
  8. vector<vector<int>> to;
  9. vector<bool> used;
  10. vector<int> matching;
  11.  
  12. bool dfs(int x) {
  13.     if (used[x]) {
  14.         return false;
  15.     }
  16.     used[x] = true;
  17.     for (auto &t : to[x]) {
  18.         if (matching[t] == -1 || dfs(matching[t])) {
  19.             matching[t] = x;
  20.             return true;
  21.         }
  22.     }
  23.     return false;
  24. }
  25.  
  26. int main() {
  27.     ios_base::sync_with_stdio(false);
  28.     ifstream fin("matching.in");
  29.     ofstream fout("matching.out");
  30.  
  31.     int n;
  32.     fin >> n;
  33.     vector<int> w(n);
  34.     vector<int> indexes(n);
  35.     for (int i = 0; i < n; ++i) {
  36.         fin >> w[i];
  37.     }
  38.     to.resize(n, vector<int>());
  39.     for (int i = 0; i < n; ++i) {
  40.         int tc;
  41.         fin >> tc;
  42.         for (int j = 0; j < tc; ++j) {
  43.             int t;
  44.             fin >> t;
  45.             t--;
  46.             to[i].push_back(t);
  47.         }
  48.     }
  49.     used.resize(n, false);
  50.     matching.resize(n, -1);
  51.  
  52.     for (int i = 0; i < n; ++i) {
  53.         indexes[i] = i;
  54.     }
  55.  
  56.     sort(indexes.begin(), indexes.end(), [&](int a, int b) { return w[a] > w[b]; });
  57.  
  58.     for (int i = 0; i < n; ++i) {
  59.         fill(used.begin(), used.end(), false);
  60.         dfs(indexes[i]);
  61.     }
  62.  
  63.     vector<int> answ_back(n, -1);
  64.     for (int i = 0; i < n; ++i) {
  65.         if (matching[i] != -1)
  66.             answ_back[matching[i]] = i;
  67.     }
  68.  
  69.     for (int i = 0; i < n; ++i) {
  70.         fout << answ_back[i] + 1 << " ";
  71.     }
  72.     fout << endl;
  73.  
  74.     fout.close();
  75.     return 0;
  76. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement