Advertisement
LinKin

Edmonds Blossom

Jun 25th, 2013
206
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.86 KB | None | 0 0
  1. /*
  2.  * Algorithm: Edmonds Blossom Maximum Matching in Generel Graph
  3.  * Order : O( N^4 )
  4.  * Note : vertx must be  indexing based
  5.  */
  6.  
  7. #include<stdio.h>
  8. #include<string.h>
  9. using namespace std;
  10. #define MAX_V 103
  11. #define MAX_E MAX_V*MAX_V
  12.  
  13. long nV,nE,Match[MAX_V];
  14. long Last[MAX_V], Next[MAX_E], To[MAX_E];
  15. long eI;
  16. long q[MAX_V], Pre[MAX_V], Base[MAX_V];
  17. bool Hash[MAX_V], Blossom[MAX_V], Path[MAX_V];
  18.  
  19. void Insert(long u, long v) {
  20.     To[eI] = v, Next[eI] = Last[u], Last[u] = eI++;
  21.     To[eI] = u, Next[eI] = Last[v], Last[v] = eI++;
  22. }
  23.  
  24. long Find_Base(long u, long v) {
  25.     memset( Path,0,sizeof(Path));
  26.     for (;;) {
  27.         Path[u] = 1;
  28.         if (Match[u] == -1) break;
  29.         u = Base[Pre[Match[u]]];
  30.     }
  31.     while (Path[v] == 0) v = Base[Pre[Match[v]]];
  32.     return v;
  33. }
  34.  
  35. void Change_Blossom(long b, long u) {
  36.     while (Base[u] != b) {
  37.         long v = Match[u];
  38.         Blossom[Base[u]] = Blossom[Base[v]] = 1;
  39.         u = Pre[v];
  40.         if (Base[u] != b) Pre[u] = v;
  41.     }
  42. }
  43.  
  44. long Contract(long u, long v) {
  45.     memset( Blossom,0,sizeof(Blossom));
  46.     long b = Find_Base(Base[u], Base[v]);
  47.     Change_Blossom(b, u);
  48.     Change_Blossom(b, v);
  49.     if (Base[u] != b) Pre[u] = v;
  50.     if (Base[v] != b) Pre[v] = u;
  51.     return b;
  52. }
  53.  
  54. void Augment(long u) {
  55.     while (u != -1) {
  56.         long v = Pre[u];
  57.         long k = Match[v];
  58.         Match[u] = v;
  59.         Match[v] = u;
  60.         u = k;
  61.     }
  62. }
  63.  
  64. long Bfs( long p ){
  65.     memset( Pre,-1,sizeof(Pre));
  66.     memset( Hash,0,sizeof(Hash));
  67.     long i;
  68.     for( i=1;i<=nV;i++ ) Base[i] = i;
  69.     q[1] = p, Hash[p] = 1;
  70.     for (long head=1, rear=1; head<=rear; head++) {
  71.         long u = q[head];
  72.         for (long e=Last[u]; e!=-1; e=Next[e]) {
  73.             long v = To[e];
  74.             if (Base[u]!=Base[v] and v!=Match[u]) {
  75.                 if (v==p or (Match[v]!=-1 and Pre[Match[v]]!=-1)) {
  76.                     long b = Contract(u, v);
  77.                     for( i=1;i<=nV;i++ ) if (Blossom[Base[i]]==1) {
  78.                         Base[i] = b;
  79.                         if (!Hash[i]) {
  80.                             Hash[i] = 1;
  81.                             q[++rear] = i;
  82.                         }
  83.                     }
  84.                 } else if (Pre[v]==-1) {
  85.                     Pre[v] = u;
  86.                     if (Match[v]==-1) {
  87.                         Augment(v);
  88.                         return 1;
  89.                     }
  90.                     else {
  91.                         q[++rear] = Match[v];
  92.                         Hash[Match[v]] = 1;
  93.                     }
  94.                 }
  95.             }
  96.         }
  97.     }
  98.     return 0;
  99. }
  100.  
  101. long Edmonds_Blossom( void ){
  102.     long i,Ans = 0;
  103.     memset( Match,-1,sizeof(Match));
  104.     for( i=1;i<=nV;i++ ) if (Match[i] == -1) Ans += Bfs(i);
  105.     return Ans;
  106. }
  107.  
  108.  
  109. int main( void ){
  110.     eI = 0;
  111.     memset( Last,-1,sizeof(Last));
  112.  
  113. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement