Grafalgo
Library of useful data structures and algorithms
|
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