Advertisement
PikMike

Untitled

May 13th, 2017
354
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.13 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. #define pb push_back
  4. #define mp make_pair
  5. #define sz(x) (int)(x).size()
  6. #define li long long
  7. #define ld long double
  8. #define x first
  9. #define y second
  10. #define pt pair<int, int>
  11. #define pll pair<li, li>
  12. #define forn(i, t) for(int i = 0; i < (t); i++)
  13. #define fore(i, f, t) for(int i = (f); i < (t); i++)
  14. #define forr(i, f, t) for(int i = (f) - 1; i >= (t); i--)
  15. #define all(x) (x).begin(), (x).end()
  16. #define ins insert
  17.  
  18. using namespace std;
  19.  
  20.  
  21. const int INF = 1e9;
  22. const int MOD = 1e9 + 7;
  23. const li INF64 = 1e18;
  24. const ld EPS = 1e-7;
  25.  
  26. mt19937 myrand(time(NULL));
  27.  
  28. const int N = 1000 + 13;
  29.  
  30. int n, c, m;
  31. vector<int> g[N];
  32.  
  33.  
  34. bool read(){
  35.     if(scanf("%d%d%d", &n, &c, &m) != 3)
  36.         return 0;
  37.     forn(i, c)
  38.         g[i] = vector<int>();
  39.     int f, t;
  40.     forn(i, m){
  41.         scanf("%d%d", &f, &t);
  42.         --f, --t;
  43.         g[t].pb(f);
  44.     }
  45.     return 1;
  46. }
  47.  
  48.  
  49. struct ed{
  50.     int x, y, w, d, f;
  51.     ed(int x, int y, int w, int d, int f) : x(x), y(y), w(w), d(d), f(f) {};
  52.     ed(){};
  53. };
  54.  
  55.  
  56. bool operator <(const ed &a, const ed &b){
  57.     if (a.x != b.x)
  58.         return a.x < b.x;
  59.     return a.y < b.y;
  60. }
  61.  
  62.  
  63. bool operator ==(const ed &a, const ed &b){
  64.     return (a.x == b.x) && (a.y == b.y);
  65. }
  66.  
  67.  
  68. vector<ed> edges;
  69. int p[2 * N];
  70.  
  71.  
  72. int blm(int v){
  73.     int st = sz(g[0]) + sz(g[1]);
  74.     int en = st + 1;
  75.    
  76.     vector<int> d(en + 1, INF);
  77.     d[v] = 0;
  78.     while (1){
  79.         bool fl = 0;
  80.         for (auto it = edges.begin(); it != edges.end(); it++){
  81.             auto e = *it;
  82.             if (e.f < e.d && d[e.x] < INF && d[e.y] > d[e.x] + e.w){
  83.                 d[e.y] = d[e.x] + e.w;
  84.                 p[e.y] = e.x;
  85.                 fl = 1;
  86.             }
  87.         }
  88.         if (!fl)
  89.             break;
  90.     }
  91.    
  92.     if (d[en] == INF)
  93.         return 0;
  94.    
  95.     int cur = en, dt = INF;
  96.     while (cur != v){
  97.         auto it = lower_bound(all(edges), ed(p[cur], cur, 0, 0, 0));
  98.         dt = min(dt, it->d - it->f);
  99.  
  100.         cur = p[cur];
  101.     }
  102.    
  103.     cur = en;
  104.     while (cur != v){
  105.         int tmp = lower_bound(all(edges), ed(p[cur], cur, 0, 0, 0)) - edges.begin();
  106.         int rtmp = lower_bound(all(edges), ed(cur, p[cur], 0, 0, 0)) - edges.begin();
  107.            
  108.         edges[tmp].f += dt;
  109.         edges[rtmp].f -= dt;
  110.        
  111.         cur = p[cur];
  112.     }
  113.    
  114.     return dt;
  115. }
  116.  
  117.  
  118. void solve(){
  119.     int ans = 0;
  120.     int cnt1 = 0, cnt2 = 0;
  121.    
  122.     sort(all(g[0]));
  123.     sort(all(g[1]));
  124.    
  125.     if (sz(g[0]) > sz(g[1]))
  126.         swap(g[0], g[1]);
  127.    
  128.     int cnt11 = 0, cnt21 = 0, cnt12 = 0, cnt22 = 0;
  129.    
  130.     for (auto it : g[0])
  131.         if (it)
  132.             cnt12++;
  133.         else
  134.             cnt11++;
  135.    
  136.     for (auto it : g[1])
  137.         if (it)
  138.             cnt22++;
  139.         else
  140.             cnt21++;
  141.    
  142.     int k = min(cnt21, cnt12);
  143.     cnt12 -= k;
  144.     cnt21 -= k;
  145.     ans += k;
  146.     k = min(cnt22, cnt11);
  147.     cnt11 -= k;
  148.     cnt22 -= k;
  149.     ans += k;
  150.    
  151.     ans += max(cnt12, cnt22);
  152.    
  153.     ans += cnt11 + cnt21;
  154.    
  155.     reverse(all(g[0]));
  156.     forn(i, cnt11)
  157.         g[0].pop_back();
  158.     reverse(all(g[0]));
  159.    
  160.     reverse(all(g[1]));
  161.     forn(i, cnt21)
  162.         g[1].pop_back();
  163.     reverse(all(g[1]));
  164.    
  165.     edges = vector<ed>();
  166.    
  167.     cnt2 = sz(g[0]) + sz(g[1]);
  168.    
  169.     forn(i, sz(g[0]))
  170.         forn(j, sz(g[1]))
  171.             if (g[0][i] != 0 || g[1][j] != 0){
  172.                 if (g[0][i] == g[1][j]){
  173.                     edges.pb(ed(j + sz(g[0]), i, -1, 0, 0));
  174.                     edges.pb(ed(i, j + sz(g[0]), 1, 1, 0));
  175.                 }
  176.                 else{
  177.                     edges.pb(ed(j + sz(g[0]), i, 0, 0, 0));
  178.                     edges.pb(ed(i, j + sz(g[0]), 0, 1, 0));
  179.                 }
  180.             }
  181.    
  182.     forn(i, sz(g[0])){
  183.         //printf("///%d %d\n", cnt2, i);
  184.         edges.pb(ed(i, cnt2, -10000, 0, 0));
  185.         edges.pb(ed(cnt2, i, 10000, 1, 0));
  186.     }
  187.    
  188.     ++cnt2;
  189.    
  190.     forn(i, sz(g[1])){
  191.         //printf("////%d %d\n", cnt1 + i, cnt2);
  192.         edges.pb(ed(cnt2, i + sz(g[0]), -10000, 0, 0));
  193.         edges.pb(ed(i + sz(g[0]), cnt2, 10000, 1, 0));
  194.     }
  195.    
  196.     sort(all(edges));
  197.    
  198.     --cnt2;
  199.    
  200.     int res = blm(cnt2);
  201.     while (res)
  202.         res = blm(cnt2);
  203.    
  204.     //for (auto it : edges)
  205.     //  if (it.d)
  206.     //      printf("%d %d %d\n", it.x, it.y, it.f);
  207.    
  208.     int sum = 0;
  209.     forn(i, sz(g[0]))
  210.         fore(j, sz(g[0]), sz(g[0]) + sz(g[1])){
  211.             auto it = lower_bound(all(edges), ed(i, j, 0, 0, 0));
  212.             if (it != edges.end() && it->f != 0){
  213.                 sum += it->w;
  214.                 //printf("%d %d\n", g[0][i], g[1][j]);
  215.             }
  216.         }
  217.    
  218.     printf("%d %d\n", ans, sum);
  219. }
  220.  
  221.  
  222. int main(){
  223.     #ifdef _DEBUG
  224.         freopen("input.txt", "r", stdin);
  225.     #endif
  226.     int n;
  227.     scanf("%d\n", &n);
  228.     forn(i, n){
  229.         read();
  230.         printf("Case #%d: ", i + 1);
  231.         solve();
  232.     }
  233.     return 0;
  234. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement