Advertisement
IanisBelu

Maze Movement

Oct 9th, 2023
55
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.08 KB | Source Code | 0 0
  1. #pragma GCC optimize("Ofast,unroll-loops")
  2. #include <bits/stdc++.h>
  3.  
  4. #define sz(a) ((int)(a).size())
  5. #define all(a) (a).begin(), (a).end()
  6.  
  7. #define fi first
  8. #define se second
  9.  
  10. using namespace std;
  11.  
  12. #ifndef LOCAL
  13. #define endl '\n'
  14. #endif
  15.  
  16. typedef long long ll;
  17. typedef pair<int, int> pii;
  18.  
  19. const int NMAX = 1005;
  20. const int INF = 2e9+5;
  21.  
  22. struct Edge {
  23.     int dest, flow, rev;
  24. };
  25.  
  26. int n, s, r, f, t;
  27. vector<Edge> g[NMAX];
  28. int d[NMAX], last[NMAX];
  29. int a[NMAX];
  30. unordered_map<string, int> mp;
  31. vector<int> v[NMAX];
  32.  
  33. int gcd(int x, int y) {
  34.     while (y) {
  35.         int r = x % y;
  36.         x = y;
  37.         y = r;
  38.     }
  39.     return x;
  40. }
  41.  
  42. void io() {
  43. #ifdef LOCAL
  44.     freopen("input.txt", "r", stdin);
  45. #else
  46.     ios_base::sync_with_stdio(false);
  47.     cin.tie(0);
  48.     cout.tie(0);
  49. #endif
  50. }
  51.  
  52. void read() {
  53.     cin >> n;
  54.     for (int i = 1; i <= n; i++)
  55.         cin >> a[i];
  56. }
  57.  
  58. void add_edge(int x, int y, int c) {
  59.     g[x].push_back({ y, c, sz(g[y]) });
  60.     g[y].push_back({ x, 0, sz(g[x]) - 1 });
  61. }
  62.  
  63. void precalc() {
  64.     sort(a + 1, a + n + 1);
  65.     for (int i = 1, d; i <= n; i++) {
  66.         for (int j = i + 1; j <= n; j++) {
  67.             if ((d = gcd(a[i], a[j])) != 1) {
  68.                 add_edge(i, j, d);
  69.                 add_edge(j, i, d);
  70.             }
  71.         }
  72.     }
  73. }
  74.  
  75. bool bfs() {
  76.     memset(d, 0, sizeof(d));
  77.     memset(last, 0, sizeof(last));
  78.  
  79.     queue<int> q;
  80.     q.push(1);
  81.     d[1] = 1;
  82.  
  83.     while (!q.empty()) {
  84.         int u = q.front();
  85.         q.pop();
  86.         if (u == n) continue;
  87.         for (auto &it : g[u]) {
  88.             if (!d[it.dest] && it.flow > 0) {
  89.                 d[it.dest] = d[u] + 1;
  90.                 q.push(it.dest);
  91.             }
  92.         }
  93.     }
  94.  
  95.     return d[n];
  96. }
  97.  
  98. int dfs(int x = 1, int flow = INF) {
  99.     if (x == n)
  100.         return flow;
  101.  
  102.     for (; last[x] < sz(g[x]); last[x]++) {
  103.         Edge &e = g[x][last[x]];
  104.         if (e.flow > 0 && d[e.dest] == d[x] + 1) {
  105.             if (int ret = dfs(e.dest, min(flow, e.flow))) {
  106.                 e.flow -= ret;
  107.                 g[e.dest][e.rev].flow += ret;
  108.                 return ret;
  109.             }
  110.         }
  111.     }
  112.  
  113.     return 0;
  114. }
  115.  
  116. int dinic() {
  117.     int max_flow = 0;
  118.     while (bfs()) {
  119.         while (int flow = dfs())
  120.             max_flow += flow;
  121.     }
  122.     return max_flow;
  123. }
  124.  
  125. signed main() {
  126.     io();
  127.     read();
  128.     precalc();
  129.     cout << dinic() << endl;
  130.     return 0;
  131. }
  132.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement