graph.prog
上传用户:gzelex
上传日期:2007-01-07
资源大小:707k
文件大小:11k
开发平台:

MultiPlatform

  1. {bf Depth First Search}
  2. #include <LEDA/graph.h>\
  3. #include <LEDA/stack.h>
  4. list<node> DFS($graph&$ $G$, $node$ $v$, $node_array<bool>&$ $reached$)
  5. ${$ 
  6. hspace*{.5cm}list<node>  $L$;\
  7. hspace*{.5cm}stack<node> $S$;\
  8. hspace*{.5cm}node $w$;
  9. smallskip
  10. hspace*{.5cm}If ( !$reached[v]$ )\
  11. hspace*{.70cm}${$  $reached[v]$ = true;\
  12. hspace*{1cm}$S$.push($v$);\
  13. hspace*{.70cm} $}$
  14. smallskip
  15. hspace*{.5cm}{bf while} ( !$S$.empty() )\
  16. hspace*{1.5cm}${$ $v = S$.pop();\ 
  17. hspace*{1.85cm}$L$.append($v$);\
  18. hspace*{1.85cm}{bf forall_adj_nodes}($w,v$)\ 
  19. hspace*{2.25cm}{bf if} ( !$reached[w]$ )\ 
  20. hspace*{2.5cm}${$ $reached[w]$ = true;\
  21. hspace*{2.75cm}$S$.push($w$);\
  22. hspace*{2.5cm}$}$
  23. smallskip
  24. hspace*{1.5cm}$}$
  25. smallskip
  26. hspace{.5cm}return $L$;
  27. smallskip
  28. $}$
  29. bigskip
  30. bigskip
  31. {bf Breadth First Search}
  32. bigskip
  33. #include <LEDA/graph.h>\ 
  34. #include <LEDA/queue.h>
  35. void BFS($graph& G, node v, node_array<int>& dist$)
  36. ${$
  37. hspace*{.5cm}queue<node> $Q$;\
  38. hspace*{.5cm}node $w$;
  39. smallskip
  40. hspace*{.5cm}{bf forall_nodes}($w,G$) $dist[w] = -1$;
  41. smallskip
  42. hspace*{.5cm}$dist[v] = 0$;\
  43. hspace*{.5cm}$Q$.append($v$);
  44. smallskip
  45. hspace*{.5cm}{bf while} ( !$Q$.empty() )\
  46. hspace*{1.5cm}${$ $v = Q$.pop();\
  47. hspace*{1.75cm}{bf forall_adj_nodes}($w,v$)\
  48. hspace*{2.25cm}{bf if} ($dist[w] < 0$)\ 
  49. hspace*{2.5cm}${$ $Q$.append($w$);\ 
  50. hspace*{2.75cm}$dist[w] = dist[v]+1$;\
  51. hspace*{2.5cm}$}$\
  52. hspace*{1.5cm}$}$
  53. smallskip
  54. $}$
  55. bigskip
  56. bigskip
  57. bigskip
  58. {bf Connected Components}
  59. bigskip
  60. #include <LEDA/graph.h>
  61. int COMPONENTS($ugraph&$ $G$, $node_array<int>&$ $compnum$)
  62. ${$
  63. hspace*{.5cm}node $v,w$;\
  64. hspace*{.5cm}list<node> $S$;\
  65. hspace*{.5cm}int $count = 0$;
  66. smallskip
  67. hspace*{.5cm}node_array(bool) $reached(G,false)$;
  68. smallskip
  69. hspace*{.5cm}Forallnodes($v,G$)
  70. hspace*{1cm}If ( !$reached[v]$ )\ 
  71. hspace*{1.25cm}${$ $S$ = DFS($G,v,reached$);\
  72. hspace*{1.5cm}Forall($w,S$) $compnum[w] = count$;\
  73. hspace*{1.5cm}$count++$;\ 
  74. hspace*{1.25cm}$}$
  75. smallskip
  76. hspace*{.5cm}Return $count$;\
  77. $}$
  78. newpage
  79. {bf Depth First Search Numbering}
  80. bigskip
  81. #include <LEDA/graph.h>
  82. int $dfs_count1, dfs_count2$;
  83. void 
  84. parbox[t]{14cm}{d_f_s($node$ $v$,$node_array<bool>&$ $S$,
  85.                                         $node_array<int>&$ $dfsnum$, 
  86.                                         $node_array<int>&$ $compnum$,
  87.                                         $list<edge>$ $T$ )}
  88. ${$ // recursive DFS
  89. smallskip
  90. hspace*{.5cm}node $w$;\
  91. hspace*{.5cm}edge $e$;
  92. smallskip
  93. hspace*{.5cm}$S[v] = true$;\
  94. hspace*{.5cm}$dfsnum[v] = ++dfs_count1$;
  95. smallskip
  96. hspace*{.5cm}Foralladjedges($e,v$)\ 
  97. hspace*{1cm}${$ $w = G$.target(e);\
  98. hspace*{1.25cm}If ( !$S[w]$ ) \
  99. hspace*{1.5cm}${$ $T$.append($e$);\
  100. hspace*{1.75cm}d_f_s($w,S,dfsnum,compnum,T$);\
  101. hspace*{1.5cm}$}$\
  102. hspace*{1cm}$}$
  103. smallskip
  104. hspace*{.5cm}$compnum[v] = ++dfs_count2$;\
  105. $}$ 
  106. bigskip
  107. bigskip
  108. list<edge> DFS_NUM($graph& G, node_array<int>& dfsnum, node_array<int>& compnum$ )
  109. ${$ \
  110. hspace*{.5cm}list<edge> $T$;\
  111. hspace*{.5cm}node_array<bool> $reached(G,false)$;\
  112. hspace*{.5cm}node $v$;\
  113. hspace*{.5cm}$dfs_count1 = dfs_count2 = 0$;\
  114. hspace*{.5cm}Forallnodes($v,G$) \
  115. hspace*{1cm}If ( !$reached[v]$ ) d_f_s($v,reached,dfsnum,compnum,T$);\
  116. hspace*{.5cm}Return $T$;\
  117. $}$\
  118. newpage
  119. {bf Topological Sorting}
  120. #include <LEDA/graph.h>
  121. bool TOPSORT($graph& G, node_array<int>& ord$)
  122. ${$\ 
  123. hspace*{.5cm}node_array<int> INDEG($G$);\
  124. hspace*{.5cm}list<node> ZEROINDEG;
  125. smallskip
  126. hspace*{.5cm}int $count=0$;\
  127. hspace*{.5cm}node $v,w$;\
  128. hspace*{.5cm}edge $e$;
  129. smallskip
  130. hspace*{.5cm}{bf forall_nodes}($v,G$)\
  131. hspace*{1cm}{bf if} ((INDEG[$v$]=$G$.indeg($v$))==0) ZEROINDEG.append($v$); 
  132. smallskip
  133. hspace*{.5cm}{bf while} (!ZEROINDEG.empty())\
  134. hspace*{1cm}${$ $v$ = ZEROINDEG.pop();\
  135. hspace*{1.25cm}$ord[v] = ++count$;
  136. smallskip
  137. hspace*{1.25cm}{bf forall_adj_nodes}($w,v$) \
  138. hspace*{1.75cm}{bf if} ($--$INDEG[$w$]==0) ZEROINDEG.append($w$);\
  139. hspace*{1cm} $}$
  140. smallskip
  141. hspace*{.5cm}{bf return} (count==G.number_of_nodes()); 
  142. smallskip
  143. $}$\
  144. bigskip
  145. //TOPSORT1 sorts node and edge lists according to the topological ordering:
  146. bigskip
  147. $bool$ TOPSORT1($graph& G$)
  148. smallskip
  149. {${$\ 
  150. hspace*{.5cm}node_array<int> node_ord($G$);\
  151. hspace*{.5cm}edge_array<int> edge_ord($G$);
  152. smallskip
  153. hspace*{.5cm}{bf if} (TOPSORT(G,node_ord))\
  154. hspace*{.75cm}${$ edge $e$;\
  155. hspace*{1cm}{bf forall_edges}($e,G$) edge_ord[$e$]=node_ord[$target(e)$];\
  156. hspace*{1cm}$G$.sort_nodes(node_ord);\
  157. hspace*{1cm}$G$.sort_edges(edge_ord);\
  158. hspace*{1cm}{bf return} true;\
  159. hspace*{.75cm}$}$\
  160. hspace*{.5cm}{bf return} false;\
  161. $}$\
  162. newpage
  163. {bf Strongly Connected Components}
  164. #include <LEDA/graph.h>\
  165. #include <LEDA/array.h>
  166. medskip
  167. int STRONG_COMPONENTS($graph& G, node_array<int>& compnum$)\
  168. ${$\
  169. hspace*{.5cm}node $v,w$;\
  170. hspace*{.5cm}int $n = G$.number_of_nodes();\
  171. hspace*{.5cm}int $count = 0$;\
  172. hspace*{.5cm}int $i$;
  173. smallskip
  174. hspace*{.5cm}array<node> $V(1,n)$;\
  175. hspace*{.5cm}list<node> $S$;\
  176. hspace*{.5cm}node_array<int>  $dfs_num(G), compl_num(G)$;\
  177. hspace*{.5cm}node_array<bool> $reached(G,false)$;
  178. smallskip
  179. hspace*{.5cm}DFS_NUM($G,dfs_num,compl_num$);
  180. smallskip
  181. hspace*{.5cm}Forallnodes($v,G$) $V[compl_num[v]] = v$;
  182. smallskip
  183. hspace*{.5cm}$G$.rev();
  184. smallskip
  185. hspace*{.5cm}For($i=n; i>0; i--$)\
  186. hspace*{1cm}If ( !$reached[V[i]]$ ) \
  187. hspace*{1.25cm}${$ $S$ = DFS($G,V[i],reached$);\
  188. hspace*{1.5cm}Forall($w,S$) $compnum[w] = count$;\
  189. hspace*{1.5cm}$count++$;\
  190. hspace*{1.25cm}$}$
  191. smallskip
  192. hspace*{.5cm}Return $count$;
  193. smallskip
  194. $}$\
  195. newpage
  196. {bf Dijkstra's Algorithm}
  197. #include <LEDA/graph.h>\ 
  198. #include <LEDA/node_pq.h>
  199. medskip
  200. void DIJKSTRA( graph& $G$, node $s$, edge_array<int>& $cost$, \
  201. hspace*{1cm}node_array<int>& $dist$, node_array<edge>& $pred$ )
  202. ${$\ 
  203. hspace*{.5cm}node_pq<int> $PQ(G)$;
  204. smallskip
  205. hspace*{.5cm}int $c$;\
  206. hspace*{.5cm}node $u,v$;\
  207. hspace*{.5cm}edge $e$;
  208. smallskip
  209. hspace*{.5cm}{bf forall_nodes}($v,G$)\
  210. hspace*{1cm}${$ $ pred[v] = 0$;\
  211. hspace*{1.25cm}$dist[v] = infinity$;\
  212. hspace*{1.25cm}$PQ$.insert($v,dist[v])$;\
  213. hspace*{1cm}$}$
  214. smallskip
  215. hspace*{.5cm}$dist[s] = 0$;\
  216. hspace*{.5cm}$PQ$.decrease_inf($s,0)$;
  217. smallskip
  218. hspace*{.5cm}{bf while} ( ! $PQ$.empty())\
  219. hspace*{1cm}${$ $u = PQ$.del_min();
  220. smallskip
  221. hspace*{1.25cm}{bf forall_adj_edges}($e,u$)\
  222. hspace*{1.75cm}${$ $v = G.target(e) $;\ 
  223. hspace*{2cm}$c = dist[u] + cost[e] $;\
  224. hspace*{2cm}{bf if} ( $c < dist[v] $)\
  225. hspace*{2.25cm}${$ $dist[v] = c$;\
  226. hspace*{2.5cm}$pred[v] = e$;\
  227. hspace*{2.5cm}$PQ$.decrease_inf($v,c$);\
  228. hspace*{2.25cm}$}$\
  229. hspace*{1.75cm}$}$ /$*$ forall_adj_edges $*$
  230. smallskip
  231. hspace*{1cm}$}$ /$*$ while $*$/
  232. smallskip
  233. $}$\
  234. newpage
  235. {bf Bellman/Ford Algorithm}
  236. #include <LEDA/graph.h>\
  237. #include <LEDA/queue.h>
  238. medskip
  239. bool BELLMAN_FORD($graph& G, node s, edge_array<int>& cost$,\
  240. hspace*{1cm}$node_array<int>& dist, node_array<edge>& pred$)
  241. ${$\ 
  242. hspace*{.5cm}node_array<bool> $in_Q(G,false)$;\
  243. hspace*{.5cm}node_array<int>  $count(G,0)$;
  244. smallskip
  245. hspace*{.5cm}int $n = G$.number_of_nodes();\
  246. hspace*{.5cm}queue<node> $Q(n)$;
  247. smallskip
  248. hspace*{.5cm}node $u,v$;\
  249. hspace*{.5cm}edge $e$;\
  250. hspace*{.5cm}int  $c$;
  251. smallskip
  252. hspace*{.5cm}Forallnodes($v,G$)\
  253. hspace*{1cm}${$ $pred[v] = 0$;\
  254. hspace*{1.25cm}$dist[v] =  infinity$; \
  255. hspace*{1cm}$}$\
  256. hspace*{.5cm}$dist[s] = 0$;\
  257. hspace*{.5cm}$Q$.append($s$);\
  258. hspace*{.5cm}$in_Q[s] = true$;
  259. smallskip
  260. hspace*{.5cm}{bf while} (!$Q$.empty())\
  261. hspace*{1cm}${$ $u = Q$.pop();\
  262. hspace*{1.25cm}$in_Q[u] = false$;
  263. smallskip
  264. hspace*{1.25cm}If ($++count[u] > n$)  {bf return} false;quad //negative cycle
  265. smallskip
  266. hspace*{1.25cm}Foralladjedges($e,u$) \
  267. hspace*{1.75cm}${$ $v$ = $G$.target($e$);\
  268. hspace*{2cm}$c = dist[u] + cost[e]$;
  269. smallskip
  270. hspace*{2cm}If ($c < dist[v]$) \
  271. hspace*{2.25cm}${$ $dist[v] = c$; \
  272. hspace*{2.5cm}$pred[v] = e$;\
  273. hspace*{2.5cm}If (!$in_Q[v]$)  \
  274. hspace*{2.75cm}${$ $Q$.append($v$);\
  275. hspace*{3cm}$in_Q[v]=true$;\
  276. hspace*{2.75cm}$}$\
  277. hspace*{2.25cm}$}$\
  278. hspace*{1.75cm}$}$ /$*$ forall_adj_edges $*$/\
  279. hspace*{1cm}$}$ /$*$ while $*$/\
  280. hspace*{.5cm}{bf return} true;\
  281. $}$\
  282. newpage
  283. {bf All Pairs Shortest Paths}
  284. #include <LEDA/graph.h>
  285. void all_pairs_shortest_paths(graph& $G$, edge_array<double>& $cost$,\
  286. hspace*{1cm}node_matrix<double>& $DIST$)\
  287. ${$\
  288. hspace*{.5cm}// computes for every node pair $(v,w)$ $DIST(v,w)$ = cost of the least cost\
  289. hspace*{.5cm}// path from $v$ to $w$, the single source shortest paths algorithms BELLMAN_FORD\
  290. hspace*{.5cm}// and DIJKSTRA are used as subroutines
  291. smallskip
  292. hspace*{.5cm}edge $e$;\
  293. hspace*{.5cm}node $v$;\
  294. hspace*{.5cm}double $C = 0$;
  295. smallskip
  296. hspace*{.5cm}{bf forall_edges}($e,G$) $C += fabs(cost[e]$);\
  297. hspace*{.5cm}node $s = G$.new_node(); hspace{3cm} // add $s$ to $G$\
  298. hspace*{.5cm}{bf forall_nodes}($v,G$) $G$.new_edge($s,v$); hspace{.75cm} // add edges ($s,v$) to $G$
  299. smallskip
  300. hspace*{.5cm}node_array<double> $dist1(G)$;\
  301. hspace*{.5cm}node_array<edge>   $pred(G)$;\
  302. hspace*{.5cm}edge_array<double> $cost1(G)$;\
  303. hspace*{.5cm}{bf forall_edges}($e,G$) 
  304. $cost1[e] = (G$.source$(e)==s)$ ? $C : cost[e]$;
  305. smallskip
  306. hspace*{.5cm}BELLMAN_FORD($G,s,cost1,dist1,pred$);
  307. smallskip
  308. hspace*{.5cm}$G$.del_node($s$); hspace{4.75cm}// delete $s$ from $G$\
  309. hspace*{.5cm}edge_array(double) $cost2(G)$;\
  310. hspace*{.5cm}{bf forall_edges}($e,G$) $cost2[e] = dist1[G.source(e)] + cost[e] - dist1[G.target(e)]$;
  311. smallskip
  312. hspace*{.5cm}{bf forall_nodes}($v,G$)  DIJKSTRA($G,v,cost2,DIST[v],pred$);
  313. smallskip
  314. hspace*{.5cm}{bf forall_nodes}($v,G$)\
  315. hspace*{1cm}bf forall_nodes}($w,G$) $DIST(v,w) = DIST(v,w) - dist1[v] + dist1[w]$;\
  316. $}$
  317. newpage
  318. {bf Minimum Spanning Tree}
  319. #include <LEDA/graph.h>\
  320. #include <LEDA/node_partition.h>
  321. medskip
  322. void MIN_SPANNING_TREE(graph& $G$, edge_array<double>& $cost$, list<edge>& $EL$)\
  323. ${$\
  324. hspace*{.5cm}node $v,w$;\
  325. hspace*{.5cm}edge $e$;\
  326. hspace*{.5cm}node_partition $Q(G)$;
  327. smallskip
  328. hspace*{.5cm}$G$.sort_edges($cost$);
  329. smallskip
  330. hspace*{.5cm}$EL$.clear();\
  331. hspace*{.5cm}{bf forall}_edges($e,G$)\
  332. hspace*{.75cm}${$ $v = G.source(e)$;\
  333. hspace*{1cm}$w = G.target(e)$;\
  334. hspace*{1cm}{bf if} ($!(Q$.same_block($v,w$))\
  335. hspace*{1.25cm}${$  $Q$.union_blocks($v,w$);\
  336. hspace*{1.5cm}$EL$.append($e$);\
  337. hspace*{1.25cm}$}$\
  338. hspace*{.75cm}$}$\
  339. $}$\
  340. newpage