Advertisement
Vince14

/<> 1017 (maximum bipartite matching)

Oct 28th, 2023
103
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.02 KB | Source Code | 0 0
  1. #include <iostream>
  2. #include <string>
  3. #include <cstring>
  4. #include <algorithm>
  5. #include <cmath>
  6. #include <vector>
  7. #include <set>
  8. #include <map>
  9. #include <stack>
  10. #include <queue>
  11. #include <deque>
  12. #include <unordered_map>
  13. #include <numeric>
  14. #include <iomanip>
  15. using namespace std;
  16. #define pii pair<int , int>
  17. #define ll long long
  18. #define FAST ios_base::sync_with_stdio(false); cin.tie(NULL)
  19. const long long dx[4] = {1, 0, -1, 0}, dy[4] = {0, -1, 0, 1};
  20. const long long dl[2] = {1, -1};
  21. const long long MOD = 1000000007;
  22. const long long MAXN = 55;
  23.  
  24. vector<int> primes;
  25. int n;
  26. int arr[55];
  27. int idx[2005];
  28. vector<int> v[55];
  29. vector<int> g1, g2;
  30. vector<int> connected;
  31. vector<bool> visited;
  32.  
  33. void init_prime(){
  34.     for(int i = 2; i <= 2000; i++){
  35.         bool ck = true;
  36.         for(int j = 2; j <= sqrt(i); j++){
  37.             if(i % j == 0){
  38.                 ck = false;
  39.                 break;
  40.             }
  41.         }
  42.         if(ck){
  43.             primes.push_back(i);
  44.         }
  45.     }
  46. }
  47.  
  48. void init(){
  49.     init_prime();
  50.     for(int i = 0; i <= 2000; i++){
  51.         idx[i] = -1;
  52.     }
  53.     for(int i = 0; i < n; i++){
  54.         cin >> arr[i];
  55.         idx[arr[i]] = i;
  56.         if(arr[i] % 2 == arr[0] % 2){
  57.             g1.push_back(i);
  58.         }
  59.         else{
  60.             g2.push_back(i);
  61.         }
  62.     }
  63.     for(int i = 0; i < n; i++){
  64.         for(auto p : primes){
  65.             if(p < arr[i]){
  66.                 continue;
  67.             }
  68.             else{
  69.                 if(idx[p - arr[i]] != -1 and idx[p - arr[i]] != i){
  70.                     v[i].push_back(idx[p - arr[i]]);
  71.                 }
  72.             }
  73.         }
  74.     }
  75. }
  76.  
  77. bool dfs(int c, int x){
  78.     if(visited[c]){
  79.         return false;
  80.     }
  81.     visited[c] = true;
  82.     if(c == 0){
  83.         if(connected[x] == -1 || dfs(connected[x], x)){
  84.             connected[x] = c;
  85.             return true;
  86.         }
  87.         return false;
  88.     }
  89.     for(int nxt : v[c]){
  90.         if(connected[nxt] == -1 || dfs(connected[nxt], x)){
  91.             connected[nxt] = c;
  92.             return true;
  93.         }
  94.     }
  95.     return false;
  96.  
  97. }
  98.  
  99. void solve(){
  100.     if(g1.size() != g2.size()){
  101.         cout << "-1\n";
  102.         return;
  103.     }
  104.     vector<int> ans;
  105.     for(auto x : v[0]){
  106.         connected.assign(n, -1);
  107.         for(auto c1 : g1){
  108.             visited.assign(n, false);
  109.             dfs(c1, x);
  110.         }
  111.         bool ck = true;
  112.         int tmp = 0;
  113.         for (int i = 0; i < g2.size(); i++){
  114.             if(connected[g2[i]] == -1){
  115.                 ck = false;
  116.                 break;
  117.             }
  118.             if(connected[g2[i]] == 0){
  119.                 tmp = arr[g2[i]];
  120.             }
  121.         }
  122.         if(ck){
  123.             ans.push_back(tmp);
  124.         }
  125.     }
  126.  
  127.     if(ans.size() == 0){
  128.         cout << "-1\n";
  129.         return;
  130.     }
  131.     else{
  132.         sort(ans.begin(), ans.end());
  133.         for(auto x : ans){
  134.             cout << x << " ";
  135.         }
  136.         return;
  137.     }
  138. }
  139.  
  140. int main() {
  141.     FAST;
  142.     cin >> n;
  143.     init();
  144.     solve();
  145. }
  146.  
  147.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement