Grafalgo
Library of useful data structures and algorithms
|
00001 #include "stdinc.h" 00002 #include "Flograph.h" 00003 #include "ppFifo.h" 00004 #include "ppHiLab.h" 00005 #include "shortPath.h" 00006 #include "dinic.h" 00007 #include "dinicDtrees.h" 00008 #include "Util.h" 00009 00010 void eval(Flograph &fg) { 00011 int n = fg.n(); int m = fg.m(); 00012 int t1, t2, floVal; 00013 00014 string stats; 00015 t1 = Util::getTime(); 00016 dinic(fg,floVal,stats); 00017 t2 = Util::getTime(); 00018 cout << n << " " << m << " " << stats; 00019 cout << " " << floVal << " " << t2-t1 << " dinic" << endl; 00020 fg.clear(); 00021 00022 t1 = Util::getTime(); 00023 dinicDtrees(fg,floVal,stats); 00024 t2 = Util::getTime(); 00025 cout << n << " " << m << " " << stats; 00026 cout << " " << floVal << " " << t2-t1 << " dinicDtrees" << endl; 00027 fg.clear(); 00028 } 00029 00030 void badcase(int k1, int k2, Flograph& fg) { 00031 int i,j, n, m, c1, c2, c3, c4, bl, br; 00032 edge e; 00033 00034 // determine first vertex in each group 00035 c1 = 2; // start of short chain from source 00036 c2 = c1 + 4*(k1-1)+1; // start of long chain from source 00037 bl = c2 + 4*(k1-1)+3; // start of 1st vertex group in bipartite graph 00038 br = bl + k2; // start of 2nd vertex group in bipartite graph 00039 c3 = br + k2; // start of long chain to sink 00040 c4 = c3 + 4*(k1-1)+3; // start of short chain to sink 00041 00042 n = c4 + 4*(k1-1)+1; 00043 m = 16*(k1-1) + k2*k2 + 8*k1 + 4; 00044 fg.resize(n,m); 00045 fg.setSrcSnk(1,n); 00046 00047 // build short chain from source 00048 for (i = 0; c1+i < c2; i++) { 00049 if ((i%4) == 0) { 00050 e = fg.join(fg.src(),c1+i); 00051 if (i == 0) fg.setCapacity(e,k2*k2*k2); 00052 else fg.setCapacity(e,k2*k2); 00053 } 00054 if (c1+i < c2-1) { 00055 e = fg.join(c1+i,c1+i+1); fg.setCapacity(e,2*k2*k2*k2); 00056 } 00057 } 00058 // build long chain from source 00059 for (i = 0; c2+i < bl; i++) { 00060 if ((i%4) == 0) { 00061 e = fg.join(fg.src(),c2+i); 00062 if (i == 0) fg.setCapacity(e,k2*k2*k2); 00063 else fg.setCapacity(e,k2*k2); 00064 } 00065 if (c2+i < bl-1) { 00066 e = fg.join(c2+i,c2+i+1); fg.setCapacity(e,2*k2*k2*k2); 00067 } 00068 } 00069 // connect source chains to bipartite graph 00070 for (i = 0; i < k2; i++) { 00071 e = fg.join(c2-1,bl+i); fg.setCapacity(e,2*k2*k2); 00072 e = fg.join(bl-1,br+i); fg.setCapacity(e,2*k2*k2); 00073 } 00074 // build central bipartite graph 00075 for (i = 0; i < k2; i++) { 00076 for (j = 0; j < k2; j++) { 00077 e = fg.join(bl+i, br+j); fg.setCapacity(e,1); 00078 } 00079 } 00080 // connect bipartite graph to sink chains 00081 for (i = 0; i < k2; i++) { 00082 e = fg.join(bl+i,c3); fg.setCapacity(e,2*k2*k2); 00083 e = fg.join(br+i,c4); fg.setCapacity(e,2*k2*k2); 00084 } 00085 // build long chain to sink 00086 for (i = 0; c3+i < c4; i++) { 00087 if ((i%4) == 2) { 00088 e = fg.join(c3+i,fg.snk()); fg.setCapacity(e,k2*k2); 00089 } 00090 if (c3+i < c4-1) { 00091 e = fg.join(c3+i,c3+i+1); fg.setCapacity(e,2*k2*k2*k2); 00092 } 00093 } 00094 // build short chain to sink 00095 for (i = 0; c4+i < n; i++) { 00096 if ((i%4) == 0) { 00097 e = fg.join(c4+i,fg.snk()); fg.setCapacity(e,k2*k2); 00098 } 00099 if (c4+i < n-1) { 00100 e = fg.join(c4+i,c4+i+1); fg.setCapacity(e,2*k2*k2*k2); 00101 } 00102 } 00103 } 00104 00105 main() { 00106 Flograph fg(10,20); 00107 00108 cout << "random graphs, increasing n\n"; 00109 int n = 1024; 00110 int m; 00111 for (int i = 10; i <= 13; i++) { 00112 m = i*n; 00113 fg.rgraph(n,m,50,20); 00114 fg.randCapacity(100*m/n,80); 00115 eval(fg); 00116 cout << endl; 00117 n += n; 00118 } 00119 cout << "bad cases - high density\n"; 00120 for (int k = 10; k <= 40; k += 10) { 00121 badcase(k,k,fg); 00122 eval(fg); 00123 cout << endl; 00124 } 00125 }