Advertisement
welleyth

688. D

Jun 3rd, 2022
709
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.87 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #include <ext/pb_ds/assoc_container.hpp>
  3. #include <ext/pb_ds/tree_policy.hpp>
  4. using namespace __gnu_pbds;
  5. using namespace std;
  6.  
  7. #define int long long
  8. #define mp make_pair
  9. #define pb push_back
  10.  
  11. #pragma GCC optimize("Ofast")
  12. #pragma GCC optimize("unroll-loops")
  13.  
  14. constexpr int INF = (int)1e18;
  15. constexpr int N = (int)5e5 + 111;
  16. constexpr int md = (int)998244353;
  17. constexpr int mdPower = (int)1e9+7 - 1;
  18.  
  19. mt19937 rnd(time(nullptr));
  20.  
  21. void add(int& a,int b){
  22.     a += b; if(a >= md) a -= md;
  23. }
  24. void sub(int& a,int b){
  25.     a -= b; while(a < 0) a += md;
  26. }
  27. void add(__int128& a,int b){
  28.     a += b;
  29. }
  30. void sub(__int128& a,int b){
  31.     a -= b;
  32. }
  33.  
  34. int bpow(int a,int b){
  35.     if(b == 0)
  36.         return 1;
  37.     if(b % 2 == 0){
  38.         int t = bpow(a,b>>1);
  39.         return t*t%md;
  40.     }
  41.     return a*bpow(a,b-1) % md;
  42. }
  43.  
  44. int inv(int a){
  45.     return bpow(a,md-2);
  46. }
  47.  
  48. int fac[N],invfac[N];
  49.  
  50. void init(){
  51.     fac[0] = 1;
  52.     for(int i = 1; i < N; i++){
  53.         fac[i] = (fac[i-1] * i) % md;
  54.     }
  55.     invfac[N-1] = inv(fac[N-1]);
  56.     for(int i = N-2; i >= 0; i--){
  57.         invfac[i] = (invfac[i+1] * (i+1))%md;
  58.     }
  59.     return;
  60. }
  61.  
  62. int C(int n,int k){
  63.     return fac[n] * invfac[k] % md * invfac[n-k] % md;
  64. }
  65.  
  66. struct edge{
  67.     int to,flow,cap,id;
  68.     edge(){}
  69.     edge(int to,int flow,int cap,int id):to(to),flow(flow),cap(cap),id(id){}
  70. };
  71.  
  72. vector<edge> e;
  73. vector<int> g[N];
  74.  
  75. void add_edge(int a,int b,int cap,int id){
  76.     g[a].pb(e.size());
  77.     e.pb(edge(b,0,cap,id));
  78.     g[b].pb(e.size());
  79.     e.pb(edge(a,0,0,0));
  80. //    cout << a << " " << b << " " << cap << "\n";
  81.     return;
  82. }
  83.  
  84. bool used[N];
  85. int d[N];
  86. int ptr[N];
  87. int s,f;
  88. int n;
  89.  
  90. bool bfs(){
  91.     for(int i = 0; i <= n+n; i++)
  92.         used[i] = false, d[i] = -1;
  93.     d[s] = 0;
  94.     used[s] = 1;
  95.     queue<int> q;
  96.     q.push(s);
  97.     while(!q.empty()){
  98.         int v = q.front();
  99. //        cerr << "bfs v = " << v << "\n";
  100.         q.pop();
  101.         for(auto& i : g[v]){
  102.             int& to = e[i].to, flow = e[i].flow, cap = e[i].cap;
  103.             if(flow < cap && d[to] == -1){
  104.                 d[to] = d[v] + 1;
  105.                 q.push(to);
  106.             }
  107.         }
  108.     }
  109.     return d[f] != -1;
  110. }
  111.  
  112. int dfs(int v,int flow = INF){
  113.     if(flow <= 0)
  114.         return 0;
  115.     if(v == f)
  116.         return flow;
  117. //    cerr << "v = " << v << "\n";
  118.     for(; ptr[v] < g[v].size(); ptr[v]++){
  119.         int i = g[v][ptr[v]];
  120.         int& to = e[i].to;
  121.         int& F = e[i].flow;
  122.         int& cap = e[i].cap;
  123. //        cerr << "to = " << to << "\n";
  124. //        cerr << d[v] << " " << d[to] << "\n";
  125. //        cerr << "cap = " << cap << ", flow = " << F << "\n";
  126.         if(d[to] != d[v] + 1)
  127.             continue;
  128.         int fl = min(flow,cap - F);
  129. //        cerr << "fl = " << fl << "\n";
  130.         int pushed = dfs(to,fl);
  131.         if(pushed){
  132.             e[i].flow += pushed;
  133.             e[i^1].flow -= pushed;
  134.             return pushed;
  135.         }
  136.     }
  137.     return 0;
  138. }
  139.  
  140. int dinic(){
  141.     int flow = 0;
  142.     while(true){
  143.         if(!bfs()) break;
  144.         memset(ptr,0,sizeof ptr);
  145.         while(int pushed = dfs(s))
  146.             flow += pushed;
  147.     }
  148.     return flow;
  149. }
  150. set<int> ans;
  151.  
  152. void dfs1(int v){
  153. //    used[v] = 1;
  154.     d[v] = 1;
  155.     for(auto& i : g[v]){
  156.         int& to = e[i].to;
  157.         int& id = e[i].id;
  158.         if(d[to] == 0 && e[i].cap > e[i].flow){
  159.             dfs1(to);
  160.         }
  161.     }
  162.     return;
  163. }
  164.  
  165. void dfs2(int v){
  166.     used[v] = 1;
  167.     for(auto& i : g[v]){
  168.         int& to = e[i].to;
  169.         int& flow = e[i].flow;
  170.         int& cap = e[i].cap;
  171.         int& id = e[i].id;
  172.         if(d[to] == 0 && cap == flow && cap > 0){
  173.             cerr << "adding " << v << " " << to << "\n";
  174.             ans.insert(id);
  175.         }
  176.     }
  177.     for(auto& i : g[v]){
  178.         int& to = e[i].to;
  179.         int& id = e[i].id;
  180.         if(!used[to] && e[i].cap > e[i].flow){
  181.             dfs2(to);
  182.         }
  183.     }
  184.     return;
  185. }
  186.  
  187. void solve(){
  188.     int m;
  189.     cin >> n >> m;
  190.     cin >> s >> f;
  191.  
  192.     for(int i = 1; i <= n; i++){
  193.         int x;
  194.         cin >> x;
  195.         add_edge(i,i+n,x,i);
  196.     }
  197.  
  198.     for(int i = 0; i < m; i++){
  199.         int a,b;
  200.         cin >> a >> b;
  201.         add_edge(a+n,b,INF,0);
  202.         add_edge(b+n,a,INF,0);
  203.     }
  204.  
  205.     int flow = dinic();
  206.     cerr << "MAXFLOW = " << flow << "\n";
  207.  
  208.     bfs();
  209.     memset(d,0,sizeof d);
  210.     memset(used,0,sizeof used);
  211.     dfs1(s);
  212.     dfs2(s);
  213.     ans.erase(0);
  214.  
  215.     for(auto& x : ans)
  216.         cout << x << " ";
  217.  
  218.     return;
  219. }
  220.  
  221. signed main(){
  222.     ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
  223.     int tests = 1;
  224. //    cin >> tests;
  225.     for(int test = 1; test <= tests; test++){
  226.         solve();
  227.     }
  228.     return 0;
  229. }
  230. /**
  231.  
  232. Jee, you see?
  233. sum <= r
  234.  
  235. z & (1 << bt) == 1
  236.  
  237. 1.
  238. dp[sum] += dp[sum-(1<<bt)]
  239.  
  240. 2. (N-(r>>bt)&1)
  241. dp[sum] += dp[sum-(1<<bt)*2]
  242.  
  243. **/
  244.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement