Advertisement
Guest User

Untitled

a guest
May 30th, 2015
306
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.32 KB | None | 0 0
  1.  
  2. /*
  3. * Àëãîðèòì Ôîðäà - Ôàëêåðñîíà äëÿ ïîèñêà ìàêñèìàëüíîãî ïîòîêà â òðàíñïîðòíîé ñåòè.
  4. *
  5. * Òðàíñïîðòíàÿ ñåòü çàäàåòñÿ ÷èñëîì óçëîâ N (2 <= N <= MAX_N) è íàáîðîì ðåáåð
  6. * ñ óêàçàíèåì ïðîïóñêíîé ñïîñîáíîñòè êàæäîãî ñóùåñòâóþùåãî ðåáðà C (0 <= C <= MAXC).
  7. * Åñëè ïðîïóñêíàÿ ñïîñîáíîñòü ðåáðà ðàâíà 0, òî ðåáðà íåò.
  8. *
  9. * Ïîòîê èùåòñÿ ìåæäó èñòî÷íèêîì S (âåðøèíà ñ íîìåðîì 0), è ñòîêîì T (âåðøèíà ñ íîìåðîì N-1).
  10. *
  11. * Èäåÿ àëãîðèòìà çàêëþ÷àåòñÿ â èòåðàòèâíîì óâåëè÷åíèè ïîòîêà ñ 0 äî ìàêñèìàëüíî âîçìîæíîãî. Íà êàæäîé èòåðàöèè èùåòñÿ ïóòü,
  12. * ïî êîòîðîìó ìîæíî ïóñòèòü äîïîëíèòåëüíûé ïîòîê èç èñòî÷íèêà â ñòîê.
  13. * Àëãîðèòì ðàáîòàåò çà âðåìÿ O(E * f), ãäå E - ÷èñëî ðåáåð, f - ìàêñèìàëüíûé ïîòîê â ñåòè.
  14. */
  15.  
  16. #define MAX_N 3 // maximum vertex count
  17. #define MAX_M 3 // maximum number of edges
  18. #define MAXC 3 // maximum edge constraint
  19.  
  20. // algorithm states:
  21. #define UNKNOWN 0
  22. #define SEARCHING_PATH 1
  23. #define SEARCHING_FINISHED 2
  24. #define CALCULATING_INC_VALUE 3
  25. #define CALCULATING_FINISHED 4
  26. #define INCREASING_FLOW 5
  27. #define INCREASING_FINISHED 6
  28. #define ALGORITHM_FINISHED 7
  29.  
  30.  
  31. typedef array {
  32. int a[MAX_N];
  33. }
  34.  
  35.  
  36. byte state; // current state
  37.  
  38. int n; // states' count
  39.  
  40. array c[MAX_N]; // edge constrains
  41. array f[MAX_N]; // edge flow
  42.  
  43. bool foundPath;
  44. int incFlowValue;
  45. int maxFlow;
  46.  
  47. int pi; // path index
  48. int path[MAX_N]; // for path saving
  49. bool visited[MAX_N]; // is vertex x visited?
  50.  
  51.  
  52. /* ------------------------------- auxiliary "functions" -------------------------------- */
  53.  
  54. int minValue;
  55.  
  56. inline min(a, b) {
  57. printf("Comparing %d and %d\n",a,b);
  58. if
  59. :: (a < b) ->
  60. minValue = a;
  61. :: else ->
  62. minValue = b;
  63. fi;
  64. }
  65.  
  66. int randomValue;
  67.  
  68. // generate random in range [minV, maxV]
  69. inline genRandom(minV, maxV) {
  70. randomValue = minV;
  71. do
  72. :: (randomValue == maxV) ->
  73. break; // increased up to max value -> stop
  74. :: else ->
  75. if
  76. :: randomValue++; // randomly increment
  77. :: break; // or stop
  78. fi;
  79. od;
  80. }
  81.  
  82.  
  83. /* ------------------------------- algorithm "functions" -------------------------------- */
  84.  
  85. int i, j; // temp variables
  86.  
  87.  
  88. inline findPathImpl() {
  89. // clearing
  90. for (i : 0..(n-1)) {
  91. visited[i] = false;
  92. }
  93.  
  94. foundPath = false;
  95. pi = 0;
  96. path[pi] = 0; // starting from source
  97. bool findNext;
  98.  
  99. // searching...
  100. do
  101. :: ((!foundPath) && (pi >= 0)) ->
  102. if
  103. :: (!visited[path[pi]]) -> // going forward
  104. visited[path[pi]] = true;
  105. if
  106. :: (path[pi] == n - 1) -> foundPath = true;
  107. :: else -> path[pi+1] = 0; // new search
  108. fi;
  109. :: else -> // continuing search
  110. path[pi+1]++;
  111. fi;
  112.  
  113. if
  114. :: (!foundPath) ->
  115. pi++;
  116. findNext = false;
  117. do
  118. :: ((path[pi] < n) && (!findNext)) ->
  119. i = path[pi - 1];
  120. j = path[pi];
  121. if
  122. :: ((c[i].a[j] - f[i].a[i] > 0) && (!visited[j])) ->
  123. findNext = true;
  124. :: else ->
  125. path[pi]++;
  126. fi;
  127. :: else -> break;
  128. od;
  129. if
  130. :: (!findNext) -> pi = pi - 2;
  131. :: else -> skip;
  132. fi;
  133. :: else -> skip;
  134. fi;
  135. :: else -> break;
  136. od;
  137. }
  138.  
  139.  
  140. inline findPath() {
  141. state = SEARCHING_PATH;
  142. findPathImpl();
  143. state = SEARCHING_FINISHED;
  144. }
  145.  
  146.  
  147. int pi2;
  148.  
  149. inline calculateIncreaseValue() {
  150. state = CALCULATING_INC_VALUE;
  151.  
  152. incFlowValue = 2 * MAXC;
  153. pi2 = 0;
  154. do
  155. :: (pi2 < pi) ->
  156. i = path[pi2];
  157. j = path[pi2 + 1];
  158.  
  159. min(incFlowValue, c[i].a[j] - f[i].a[j]);
  160. incFlowValue = minValue;
  161.  
  162. pi2++;
  163. :: else -> break;
  164. od;
  165.  
  166. state = CALCULATING_FINISHED;
  167. }
  168.  
  169. inline increaseFlow() {
  170. state = INCREASING_FLOW;
  171.  
  172. pi2 = 0;
  173. do
  174. :: (pi2 < pi) ->
  175. i = path[pi2];
  176. j = path[pi2 + 1];
  177.  
  178. printf("From %d to %d reduce %d\n", i, j, incFlowValue);
  179.  
  180. f[i].a[j] = f[i].a[j] + incFlowValue;
  181. f[j].a[i] = f[j].a[i] - incFlowValue;
  182.  
  183. pi2++;
  184. :: else -> break;
  185. od;
  186. maxFlow = maxFlow + incFlowValue;
  187.  
  188. state = INCREASING_FINISHED;
  189. }
  190.  
  191.  
  192. inline findMaxFlow() {
  193. maxFlow = 0;
  194.  
  195. findPath();
  196. do
  197. :: (foundPath) ->
  198. calculateIncreaseValue();
  199. increaseFlow();
  200.  
  201. if
  202. :: (incFlowValue > 0) -> findPath();
  203. :: else -> foundPath = false;
  204. fi;
  205. :: else -> break;
  206. od;
  207.  
  208. state = ALGORITHM_FINISHED;
  209. }
  210.  
  211.  
  212. init {
  213. printf("INIT: Starting\n\n");
  214.  
  215. printf("Generating input:\n");
  216.  
  217. genRandom(2, MAX_N);
  218. n = randomValue;
  219. genRandom(0, MAX_M);
  220. int m = randomValue;
  221. printf("Vertex count = %d\n", n);
  222. printf("Edges (count = %d):\n", m);
  223. int en, cc;
  224. for (en : 0..(m-1)) {
  225. genRandom(0, n - 1);
  226. i = randomValue;
  227. genRandom(0, n - 1);
  228. j = randomValue;
  229. genRandom(1, MAXC);
  230. cc = randomValue;
  231. printf("%d -> %d, c = %d\n", i, j, cc);
  232. c[i].a[j] = cc;
  233. }
  234. printf("\n");
  235.  
  236. printf("Starting algorithm...\n");
  237. findMaxFlow();
  238. printf("Finished. Max flow = %d\n\n", maxFlow);
  239.  
  240. findPathImpl();
  241.  
  242. printf("INIT: Finished\n");
  243. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement