Grafalgo
Library of useful data structures and algorithms
/Users/jst/src/grafalgo/cpp/graphAlgorithms/maxFlo/badCase.cpp
00001 
00018 #include "Adt.h"
00019 #include "Util.h"
00020 #include "Flograph.h"
00021 
00022 using namespace grafalgo;
00023 
00024 void badcase(int, int, Flograph&);
00025 
00026 int main(int argc, char* argv[]) {
00027         int k1, k2;
00028 
00029         if (argc != 3 || (sscanf(argv[1],"%d",&k1)) != 1 ||
00030                          (sscanf(argv[2],"%d",&k2)) != 1)
00031                 Util::fatal("usage badCase k1 k2");
00032 
00033         Flograph fg(10,20);
00034         badcase(k1,k2,fg);
00035 
00036         string s;
00037         cout << fg;
00038 }
00039 
00040 void badcase(int k1, int k2, Flograph& fg) {
00041         int i,j, n, m, c1, c2, c3, c4, bl, br;
00042         edge e;
00043 
00044         // determine first vertex in each group
00045         c1 = 2;                 // start of short chain from source
00046         c2 = c1 + 4*(k1-1)+1;   // start of long chain from source
00047         bl = c2 + 4*(k1-1)+3;   // start of 1st vertex group in bipartite graph
00048         br = bl + k2;           // start of 2nd vertex group in bipartite graph
00049         c3 = br + k2;           // start of long chain to sink
00050         c4 = c3 + 4*(k1-1)+3;   // start of short chain to sink
00051 
00052         n = c4 + 4*(k1-1)+1;
00053         m = 16*(k1-1) + k2*k2 + 8*k1 + 4;       
00054         fg.resize(n,m);
00055         fg.setSrc(1); fg.setSnk(n);
00056 
00057         // build short chain from source
00058         for (i = 0; c1+i < c2; i++) {
00059                 if ((i%4) == 0) { 
00060                         e = fg.join(fg.src(),c1+i); 
00061                         if (i == 0) fg.setCapacity(e,k2*k2*k2);
00062                         else fg.setCapacity(e,k2*k2);
00063                 }
00064                 if (c1+i < c2-1) { 
00065                         e = fg.join(c1+i,c1+i+1); fg.setCapacity(e,2*k2*k2*k2);
00066                 }
00067         }
00068         // build long chain from source
00069         for (i = 0; c2+i < bl; i++) {
00070                 if ((i%4) == 0) { 
00071                         e = fg.join(fg.src(),c2+i);
00072                         if (i == 0) fg.setCapacity(e,k2*k2*k2);
00073                         else fg.setCapacity(e,k2*k2);
00074                 }
00075                 if (c2+i < bl-1) { 
00076                         e = fg.join(c2+i,c2+i+1); fg.setCapacity(e,2*k2*k2*k2);
00077                 }
00078         }
00079         // connect source chains to bipartite graph
00080         for (i = 0; i < k2; i++) {
00081                 e = fg.join(c2-1,bl+i); fg.setCapacity(e,2*k2*k2); 
00082                 e = fg.join(bl-1,br+i); fg.setCapacity(e,2*k2*k2);
00083         }
00084         // build central bipartite graph
00085         for (i = 0; i < k2; i++) {
00086                 for (j = 0; j < k2; j++) {
00087                         e = fg.join(bl+i, br+j); fg.setCapacity(e,1);
00088                 }
00089         }
00090         // connect bipartite graph to sink chains
00091         for (i = 0; i < k2; i++) {
00092                 e = fg.join(bl+i,c3); fg.setCapacity(e,2*k2*k2); 
00093                 e = fg.join(br+i,c4); fg.setCapacity(e,2*k2*k2);
00094         }
00095         // build long chain to sink
00096         for (i = 0; c3+i < c4; i++) {
00097                 if ((i%4) == 2) {
00098                         e = fg.join(c3+i,fg.snk()); fg.setCapacity(e,k2*k2);
00099                 }
00100                 if (c3+i < c4-1) { 
00101                         e = fg.join(c3+i,c3+i+1); fg.setCapacity(e,2*k2*k2*k2);
00102                 }
00103         }
00104         // build short chain to sink
00105         for (i = 0; c4+i < n; i++) {
00106                 if ((i%4) == 0) { 
00107                         e = fg.join(c4+i,fg.snk()); fg.setCapacity(e,k2*k2);
00108                 }
00109                 if (c4+i < n-1) { 
00110                         e = fg.join(c4+i,c4+i+1); fg.setCapacity(e,2*k2*k2*k2);
00111                 }
00112         }
00113 }
00114 
 All Classes Files Functions Variables Typedefs Friends