Advertisement
Guest User

Untitled

a guest
Nov 23rd, 2014
148
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.48 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <algorithm>
  4. #include <cmath>
  5. #include <cstdio>
  6. #include <cstdlib>
  7. #include <climits>
  8.  
  9. using namespace std;
  10.  
  11. int n, m, u;
  12. int parent[2000];
  13.  
  14. vector<int> mt(2000);
  15. vector<pair<int, int>> edges;
  16. vector<vector<int>> g;                          
  17.  
  18. bool kuhn(int v) {
  19.     if (parent[v] == u)
  20.         return false;
  21.        
  22.     parent[v] = u;
  23.     for (int i = 0; i < g[v].size(); ++i) {
  24.         int to = g[v][i];
  25.         if (mt[to] == -1 || kuhn(mt[to])) {
  26.             mt[to] = v;
  27.             return true;
  28.         }
  29.     }
  30.  
  31.     return false;
  32. }
  33.  
  34. void solve() {
  35.     int result = INT_MAX;
  36.    
  37.     for (int i = 0; i < n; ++i) {
  38.         int with_i = 0, without_i = 0;
  39.         int ans = 0;
  40.  
  41.         for (int j = 0; j < n; ++j)
  42.             g[j].clear();
  43.            
  44.         mt.clear();
  45.         mt.resize(2000, -1);
  46.         for (int j = 0; j < m; ++j) {
  47.             if ((edges[j].first == i) || (edges[j].second == i))
  48.                 ++with_i;
  49.             else {
  50.                 g[edges[j].first].push_back(edges[j].second);
  51.                 ++without_i;
  52.             }
  53.         }
  54.        
  55.         for (int j = 0; j < n; ++j)
  56.             u++, kuhn(j);
  57.  
  58.         int in_match = 0;
  59.         for (int j = 0; j < n; ++j)
  60.             if (mt[j] != -1)
  61.                 in_match++;
  62.  
  63.         ans += 2 * (n - 1) + 1 - with_i + without_i - in_match + (n - 1) - in_match;
  64.         result = min(result, ans);
  65.     }
  66.  
  67.     cout << result << endl;              
  68. }
  69.  
  70. int main() {
  71.     scanf("%d%d", &n, &m);
  72.     g.resize(2000, vector<int>());
  73.    
  74.     for (int i = 0; i < m; ++i) {
  75.         int u, v;
  76.         scanf("%d%d", &u, &v);
  77.         u--, v--;
  78.         edges.push_back(make_pair(u, v));
  79.     }
  80.    
  81.     solve();
  82. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement