Matrix_code

graph - Maximum Bipartite Matching & Vertex Cover

May 1st, 2016 (edited)
201
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.43 KB | None | 0 0
  1. /**************************************************************
  2.     Maximum Matching in Bipartite Graph (Kuhn's Algorithm)
  3.     Complexity : O(VE)
  4.     Input:
  5.     * n = # nodes in Left Part
  6.     * m = # nodes in Right Part;
  7.     * G = Adjacency List Repr. of Graph
  8.     Output:
  9.     * Maximum Matching By maxMatching() function
  10.     * Vertex cover
  11.     * Matched egdes link[]
  12.  
  13.     Index : 1-based
  14.     Important :
  15.     * Maximum Matching = Minimum Vertex Cover = totalNode - Maximum Independent Set
  16.     * Minimum Edge Cover = Maximum Matching + # of nodes which are not matched
  17. ***************************************************************/
  18.  
  19.  
  20. #include<bits/stdc++.h>
  21. using namespace std;
  22.  
  23. const int N = 1001;
  24.  
  25. int n,m;
  26. vector<int>G[N];
  27. int link[N],S[N],T[N], rig[N];
  28.  
  29. bool dfs(int u)
  30. {
  31.     S[u] = 1;
  32.     for(int i= 0;i < G[u].size(); i ++) {
  33.         int v = G[u][i];
  34.         if(T[v]) continue;
  35.         T[v] = 1;
  36.         if(link[v] == -1 || dfs(link[v])) {
  37.             link[v] = u;
  38.             rig[u] = v;
  39.             return 1;
  40.         }
  41.     }
  42.     return 0;
  43. }
  44.  
  45. int maxMatching()
  46. {
  47.     int ret = 0;
  48.     memset(link, - 1 , sizeof link);
  49.     memset(rig, -1, sizeof rig );
  50.     for(int i = 1; i <= n ; i ++) {
  51.         memset(S,0,sizeof S);
  52.         memset(T,0,sizeof T);
  53.         if(dfs(i)) ret ++;
  54.     }
  55.     return ret;
  56. }
  57.  
  58. pair<vector<int>,vector<int> > VerTex_Cover()
  59. {
  60.     vector<int> L,R;
  61.     memset(S,0,sizeof S);
  62.     memset(T,0,sizeof T);
  63.    
  64.     for(int i = 1;i <= n; i ++) {
  65.         if(rig[i]== -1) dfs(i);
  66.     }
  67.  
  68.     for(int i = 1; i <= n; i ++) if(!S[i]) L.push_back(i);
  69.     for(int i = 1; i <= m; i ++) if(T[i]) R.push_back(i);
  70.     return make_pair(L,R);
  71. }
  72. /*
  73.     Input Graph :
  74.     5 5 7
  75.     1 2
  76.     3 1
  77.     4 2
  78.     3 5
  79.     2 4
  80.     2 5
  81.     5 1
  82. */
  83.  
  84. int main()
  85. {
  86.     //freopen("/home/matrixcode/Documents/code/in.txt","r",stdin);
  87.     int edge,a,b;
  88.     scanf("%d %d %d",&n,&m,&edge);
  89.     for(int i = 0; i < edge; i ++) {
  90.         scanf("%d %d",&a,&b);
  91.         G[a].push_back(b);
  92.     }
  93.     /*
  94.     Expected:
  95.     Maximum Bipartite Matching = 4
  96.     Printing Vertex Cover
  97.     Left Side: 2 3 5
  98.     Right Side: 2
  99.     */
  100.     int match = maxMatching();
  101.     printf("Maximum Bipartite Matching = %d\n",match );
  102.     printf("Printing Vertex Cover\n");
  103.     pair<vector<int>,vector<int> > vc = VerTex_Cover();
  104.     printf("Left Side:");
  105.     for(int i = 0; i < vc.first.size() ; i ++) printf(" %d", vc.first[i]); puts("");
  106.     printf("Right Side:");
  107.     for(int i = 0; i < vc.second.size(); i++ ) printf(" %d", vc.second[i]); puts("");
  108.  
  109. }
Add Comment
Please, Sign In to add comment