bhupixb

Tress

Jun 19th, 2018
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 42.59 KB | None | 0 0
  1.  
  2. This file contains the code from "Algorithms in C++, Third Edition,
  3. Part 5," by Robert Sedgewick, and is covered under the copyright
  4. and warranty notices in that book. Permission is granted for this
  5. code to be used for educational purposes in association with the text,
  6. and for other uses not covered by copyright laws, provided that
  7. the following notice is included with the code:
  8.  
  9. "This code is from "Algorithms in C++, Third Edition,"
  10. by Robert Sedgewick, Addison-Wesley, 2002."
  11.  
  12. Commercial uses of this code require the explicit written
  13. permission of the publisher. Send your request for permission,
  14. stating clearly what code you would like to use, and in what
  15. specific way, to: [email protected]
  16.  
  17.  
  18. ----------
  19. CHAPTER 17. Graph Properties and Types
  20. -----
  21. struct Edge
  22. { int v, w;
  23. Edge(int v = -1, int w = -1) : v(v), w(w) { }
  24. };
  25. class GRAPH
  26. { private:
  27. // Implementation-dependent code
  28. public:
  29. GRAPH(int, bool);
  30. ~GRAPH();
  31. int V() const;
  32. int E() const;
  33. bool directed() const;
  34. int insert(Edge);
  35. int remove(Edge);
  36. bool edge(int, int);
  37. class adjIterator
  38. {
  39. public:
  40. adjIterator(const GRAPH &, int);
  41. int beg();
  42. int nxt();
  43. bool end();
  44. };
  45. };
  46. -----
  47. template <class Graph>
  48. vector <Edge> edges(Graph &G)
  49. { int E = 0;
  50. vector <Edge> a(G.E());
  51. for (int v = 0; v < G.V(); v++)
  52. {
  53. typename Graph::adjIterator A(G, v);
  54. for (int w = A.beg(); !A.end(); w = A.nxt())
  55. if (G.directed() || v < w)
  56. a[E++] = Edge(v, w);
  57. }
  58. return a;
  59. }
  60. -----
  61. template <class Graph>
  62. void IO<Graph>::show(const Graph &G)
  63. {
  64. for (int s = 0; s < G.V(); s++)
  65. {
  66. cout.width(2); cout << s << ":";
  67. typename Graph::adjIterator A(G, s);
  68. for (int t = A.beg(); !A.end(); t = A.nxt())
  69. { cout.width(2); cout << t << " "; }
  70. cout << endl;
  71. }
  72. }
  73. -----
  74. template <class Graph>
  75. class IO
  76. {
  77. public:
  78. static void show(const Graph &);
  79. static void scanEZ(Graph &);
  80. static void scan(Graph &);
  81. };
  82. -----
  83. template <class Graph>
  84. class CC
  85. {
  86. private:
  87. // implementation-dependent code
  88. public:
  89. CC(const Graph &);
  90. int count();
  91. bool connect(int, int);
  92. };
  93. -----
  94. #include <iostream.h>
  95. #include <stdlib.h>
  96. #include "GRAPH.cc"
  97. #include "IO.cc"
  98. #include "CC.cc"
  99. main(int argc, char *argv[])
  100. { int V = atoi(argv[1]);
  101. GRAPH G(V);
  102. IO<GRAPH>::scan(G);
  103. if (V < 20) IO<GRAPH>::show(G);
  104. cout << G.E() << " edges ";
  105. CC<GRAPH> Gcc(G);
  106. cout << Gcc.count() << " components" << endl;
  107. }
  108. -----
  109. class DenseGRAPH
  110. { int Vcnt, Ecnt; bool digraph;
  111. vector <vector <bool> > adj;
  112. public:
  113. DenseGRAPH(int V, bool digraph = false) :
  114. adj(V), Vcnt(V), Ecnt(0), digraph(digraph)
  115. {
  116. for (int i = 0; i < V; i++)
  117. adj[i].assign(V, false);
  118. }
  119. int V() const { return Vcnt; }
  120. int E() const { return Ecnt; }
  121. bool directed() const { return digraph; }
  122. void insert(Edge e)
  123. { int v = e.v, w = e.w;
  124. if (adj[v][w] == false) Ecnt++;
  125. adj[v][w] = true;
  126. if (!digraph) adj[w][v] = true;
  127. }
  128. void remove(Edge e)
  129. { int v = e.v, w = e.w;
  130. if (adj[v][w] == true) Ecnt--;
  131. adj[v][w] = false;
  132. if (!digraph) adj[w][v] = false;
  133. }
  134. bool edge(int v, int w) const
  135. { return adj[v][w]; }
  136. class adjIterator;
  137. friend class adjIterator;
  138. };
  139. -----
  140. class DenseGRAPH::adjIterator
  141. { const DenseGRAPH &G;
  142. int i, v;
  143. public:
  144. adjIterator(const DenseGRAPH &G, int v) :
  145. G(G), v(v), i(-1) { }
  146. int beg()
  147. { i = -1; return nxt(); }
  148. int nxt()
  149. {
  150. for (i++; i < G.V(); i++)
  151. if (G.adj[v][i] == true) return i;
  152. return -1;
  153. }
  154. bool end()
  155. { return i >= G.V(); }
  156. };
  157. -----
  158. class SparseMultiGRAPH
  159. { int Vcnt, Ecnt; bool digraph;
  160. struct node
  161. { int v; node* next;
  162. node(int x, node* t) { v = x; next = t; }
  163. };
  164. typedef node* link;
  165. vector <link> adj;
  166. public:
  167. SparseMultiGRAPH(int V, bool digraph = false) :
  168. adj(V), Vcnt(V), Ecnt(0), digraph(digraph)
  169. { adj.assign(V, 0); }
  170. int V() const { return Vcnt; }
  171. int E() const { return Ecnt; }
  172. bool directed() const { return digraph; }
  173. void insert(Edge e)
  174. { int v = e.v, w = e.w;
  175. adj[v] = new node(w, adj[v]);
  176. if (!digraph) adj[w] = new node(v, adj[w]);
  177. Ecnt++;
  178. }
  179. void remove(Edge e);
  180. bool edge(int v, int w) const;
  181. class adjIterator;
  182. friend class adjIterator;
  183. };
  184. -----
  185. class SparseMultiGRAPH::adjIterator
  186. { const SparseMultiGRAPH &G;
  187. int v;
  188. link t;
  189. public:
  190. adjIterator(const SparseMultiGRAPH &G, int v) :
  191. G(G), v(v) { t = 0; }
  192. int beg()
  193. { t = G.adj[v]; return t ? t->v : -1; }
  194. int nxt()
  195. { if (t) t = t->next; return t ? t->v : -1; }
  196. bool end()
  197. { return t == 0; }
  198. };
  199. -----
  200. template <class Graph> class DEGREE
  201. { const Graph &G;
  202. vector <int> degree;
  203. public:
  204. DEGREE(const Graph &G) : G(G), degree(G.V(), 0)
  205. {
  206. for (int v = 0; v < G.V(); v++)
  207. { typename Graph::adjIterator A(G, v);
  208. for (int w = A.beg(); !A.end(); w = A.nxt())
  209. degree[v]++;
  210. }
  211. }
  212. int operator[](int v) const
  213. { return degree[v]; }
  214. };
  215. -----
  216. static void randE(Graph &G, int E)
  217. {
  218. for (int i = 0; i < E; i++)
  219. {
  220. int v = int(G.V()*rand()/(1.0+RAND_MAX));
  221. int w = int(G.V()*rand()/(1.0+RAND_MAX));
  222. G.insert(Edge(v,w));
  223. }
  224. }
  225. -----
  226. static void randG(Graph &G, int E)
  227. { double p = 2.0*E/G.V()/(G.V()-1);
  228. for (int i = 0; i < G.V(); i++)
  229. for (int j = 0; j < i; j++)
  230. if (rand() < p*RAND_MAX)
  231. G.insert(Edge(i, j));
  232. }
  233. -----
  234. #include "ST.cc"
  235. template <class Graph>
  236. void IO<Graph>::scan(Graph &G)
  237. { string v, w;
  238. ST st;
  239. while (cin >> v >> w)
  240. G.insert(Edge(st.index(v), st.index(w)));
  241. }
  242. -----
  243. #include <string>
  244. class ST
  245. { int N, val;
  246. struct node
  247. { int v, d; node* l, *m, *r;
  248. node(int d) : v(-1), d(d), l(0), m(0), r(0) {}
  249. };
  250. typedef node* link;
  251. link head;
  252. link indexR(link h, const string &s, int w)
  253. { int i = s[w];
  254. if (h == 0) h = new node(i);
  255. if (i == 0)
  256. {
  257. if (h->v == -1) h->v = N++;
  258. val = h->v;
  259. return h;
  260. }
  261. if (i < h->d) h->l = indexR(h->l, s, w);
  262. if (i == h->d) h->m = indexR(h->m, s, w+1);
  263. if (i > h->d) h->r = indexR(h->r, s, w);
  264. return h;
  265. }
  266. public:
  267. ST() : head(0), N(0) { }
  268. int index(const string &key)
  269. { head = indexR(head, key, 0); return val; }
  270. };
  271. -----
  272. template <class Graph> class sPATH
  273. { const Graph &G;
  274. vector <bool> visited;
  275. bool found;
  276. bool searchR(int v, int w)
  277. {
  278. if (v == w) return true;
  279. visited[v] = true;
  280. typename Graph::adjIterator A(G, v);
  281. for (int t = A.beg(); !A.end(); t = A.nxt())
  282. if (!visited[t])
  283. if (searchR(t, w)) return true;
  284. return false;
  285. }
  286. public:
  287. sPATH(const Graph &G, int v, int w) :
  288. G(G), visited(G.V(), false)
  289. { found = searchR(v, w); }
  290. bool exists() const
  291. { return found; }
  292. };
  293. -----
  294. bool searchR(int v, int w, int d)
  295. {
  296. if (v == w) return (d == 0);
  297. visited[v] = true;
  298. typename Graph::adjIterator A(G, v);
  299. for (int t = A.beg(); !A.end(); t = A.nxt())
  300. if (!visited[t])
  301. if (searchR(t, w, d-1)) return true;
  302. visited[v] = false;
  303. return false;
  304. }
  305. -----
  306. template <class Graph> class ePATH
  307. { Graph G;
  308. int v, w;
  309. bool found;
  310. STACK <int> S;
  311. int tour(int v);
  312. public:
  313. ePATH(const Graph &G, int v, int w) :
  314. G(G), v(v), w(w)
  315. { DEGREE<Graph> deg(G);
  316. int t = deg[v] + deg[w];
  317. if ((t % 2) != 0) { found = false; return; }
  318. for (t = 0; t < G.V(); t++)
  319. if ((t != v) && (t != w))
  320. if ((deg[t] % 2) != 0)
  321. { found = false; return; }
  322. found = true;
  323. }
  324. bool exists() const
  325. { return found; }
  326. void show();
  327. };
  328. -----
  329. template <class Graph>
  330. int ePATH<Graph>::tour(int v)
  331. {
  332. while (true)
  333. { typename Graph::adjIterator A(G, v);
  334. int w = A.beg(); if (A.end()) break;
  335. S.push(v);
  336. G.remove(Edge(v, w));
  337. v = w;
  338. }
  339. return v;
  340. }
  341. template <class Graph>
  342. void ePATH<Graph>::show()
  343. {
  344. if (!found) return;
  345. while (tour(v) == v && !S.empty())
  346. { v = S.pop(); cout << "-" << v; }
  347. cout << endl;
  348. }
  349.  
  350. ----------
  351. CHAPTER 18. Graph Search
  352. -----
  353. #include <vector>
  354. template <class Graph> class cDFS
  355. { int cnt;
  356. const Graph &G;
  357. vector <int> ord;
  358. void searchC(int v)
  359. {
  360. ord[v] = cnt++;
  361. typename Graph::adjIterator A(G, v);
  362. for (int t = A.beg(); !A.end(); t = A.nxt())
  363. if (ord[t] == -1) searchC(t);
  364. }
  365. public:
  366. cDFS(const Graph &G, int v = 0) :
  367. G(G), cnt(0), ord(G.V(), -1)
  368. { searchC(v); }
  369. int count() const { return cnt; }
  370. int operator[](int v) const { return ord[v]; }
  371. };
  372. -----
  373. template <class Graph> class SEARCH
  374. {
  375. protected:
  376. const Graph &G;
  377. int cnt;
  378. vector <int> ord;
  379. virtual void searchC(Edge) = 0;
  380. void search()
  381. { for (int v = 0; v < G.V(); v++)
  382. if (ord[v] == -1) searchC(Edge(v, v)); }
  383. public:
  384. SEARCH (const Graph &G) : G(G),
  385. ord(G.V(), -1), cnt(0) { }
  386. int operator[](int v) const { return ord[v]; }
  387. };
  388. -----
  389. template <class Graph>
  390. class DFS : public SEARCH<Graph>
  391. { vector<int> st;
  392. void searchC(Edge e)
  393. { int w = e.w;
  394. ord[w] = cnt++; st[e.w] = e.v;
  395. typename Graph::adjIterator A(G, w);
  396. for (int t = A.beg(); !A.end(); t = A.nxt())
  397. if (ord[t] == -1) searchC(Edge(w, t));
  398. }
  399. public:
  400. DFS(const Graph &G) : SEARCH<Graph>(G),
  401. st(G.V(), -1) { search(); }
  402. int ST(int v) const { return st[v]; }
  403. };
  404. -----
  405. template <class Graph> class CC
  406. { const Graph &G;
  407. int ccnt;
  408. vector <int> id;
  409. void ccR(int w)
  410. {
  411. id[w] = ccnt;
  412. typename Graph::adjIterator A(G, w);
  413. for (int v = A.beg(); !A.end(); v = A.nxt())
  414. if (id[v] == -1) ccR(v);
  415. }
  416. public:
  417. CC(const Graph &G) : G(G), ccnt(0), id(G.V(), -1)
  418. {
  419. for (int v = 0; v < G.V(); v++)
  420. if (id[v] == -1) { ccR(v); ccnt++; }
  421. }
  422. int count() const { return ccnt; }
  423. bool connect(int s, int t) const
  424. { return id[s] == id[t]; }
  425. };
  426. -----
  427. template <class Graph>
  428. class EULER : public SEARCH<Graph>
  429. {
  430. void searchC(Edge e)
  431. { int v = e.v, w = e.w;
  432. ord[w] = cnt++;
  433. cout << "-" << w;
  434. typename Graph::adjIterator A(G, w);
  435. for (int t = A.beg(); !A.end(); t = A.nxt())
  436. if (ord[t] == -1) searchC(Edge(w, t));
  437. else if (ord[t] < ord[v])
  438. cout << "-" << t << "-" << w;
  439. if (v != w) cout << "-" << v; else cout << endl;
  440. }
  441. public:
  442. EULER(const Graph &G) : SEARCH<Graph>(G)
  443. { search(); }
  444. };
  445.  
  446. -----
  447. template <class Graph> class BI
  448. { const Graph &G;
  449. bool OK;
  450. vector <int> vc;
  451. bool dfsR(int v, int c)
  452. {
  453. vc[v] = (c+1) %2;
  454. typename Graph::adjIterator A(G, v);
  455. for (int t = A.beg(); !A.end(); t = A.nxt())
  456. if (vc[t] == -1)
  457. { if (!dfsR(t, vc[v])) return false; }
  458. else if (vc[t] != c) return false;
  459. return true;
  460. }
  461. public:
  462. BI(const Graph &G) : G(G), OK(true), vc(G.V(),-1)
  463. {
  464. for (int v = 0; v < G.V(); v++)
  465. if (vc[v] == -1)
  466. if (!dfsR(v, 0)) { OK = false; return; }
  467. }
  468. bool bipartite() const { return OK; }
  469. int color(int v) const { return vc[v]; }
  470. };
  471. -----
  472. template <class Graph>
  473. class EC : public SEARCH<Graph>
  474. { int bcnt;
  475. vector <int> low;
  476. void searchC(Edge e)
  477. { int w = e.w;
  478. ord[w] = cnt++; low[w] = ord[w];
  479. typename Graph::adjIterator A(G, w);
  480. for (int t = A.beg(); !A.end(); t = A.nxt())
  481. if (ord[t] == -1)
  482. {
  483. searchC(Edge(w, t));
  484. if (low[w] > low[t]) low[w] = low[t];
  485. if (low[t] == ord[t])
  486. bcnt++; // w-t is a bridge
  487. }
  488. else if (t != e.v)
  489. if (low[w] > ord[t]) low[w] = ord[t];
  490. }
  491. public:
  492. EC(const Graph &G) : SEARCH<Graph>(G),
  493. bcnt(0), low(G.V(), -1)
  494. { search(); }
  495. int count() const { return bcnt+1; }
  496. };
  497. -----
  498. #include "QUEUE.cc"
  499. template <class Graph>
  500. class BFS : public SEARCH<Graph>
  501. { vector<int> st;
  502. void searchC(Edge e)
  503. { QUEUE<Edge> Q;
  504. Q.put(e);
  505. while (!Q.empty())
  506. if (ord[(e = Q.get()).w] == -1)
  507. { int v = e.v, w = e.w;
  508. ord[w] = cnt++; st[w] = v;
  509. typename Graph::adjIterator A(G, w);
  510. for (int t = A.beg(); !A.end(); t = A.nxt())
  511. if (ord[t] == -1) Q.put(Edge(w, t));
  512. }
  513. }
  514. public:
  515. BFS(Graph &G) : SEARCH<Graph>(G), st(G.V(), -1)
  516. { search(); }
  517. int ST(int v) const { return st[v]; }
  518. };
  519. -----
  520. void searchC(Edge e)
  521. { QUEUE<Edge> Q;
  522. Q.put(e); ord[e.w] = cnt++;
  523. while (!Q.empty())
  524. {
  525. e = Q.get(); st[e.w] = e.v;
  526. typename Graph::adjIterator A(G, e.w);
  527. for (int t = A.beg(); !A.end(); t = A.nxt())
  528. if (ord[t] == -1)
  529. { Q.put(Edge(e.w, t)); ord[t] = cnt++; }
  530. }
  531. }
  532. -----
  533. #include "GQ.cc"
  534. template <class Graph>
  535. class PFS : public SEARCH<Graph>
  536. { vector<int> st;
  537. void searchC(Edge e)
  538. { GQ<Edge> Q(G.V());
  539. Q.put(e); ord[e.w] = cnt++;
  540. while (!Q.empty())
  541. {
  542. e = Q.get(); st[e.w] = e.v;
  543. typename Graph::adjIterator A(G, e.w);
  544. for (int t = A.beg(); !A.end(); t = A.nxt())
  545. if (ord[t] == -1)
  546. { Q.put(Edge(e.w, t)); ord[t] = cnt++; }
  547. else
  548. if (st[t] == -1) Q.update(Edge(e.w, t));
  549. }
  550. }
  551. public:
  552. PFS(Graph &G) : SEARCH<Graph>(G), st(G.V(), -1)
  553. { search(); }
  554. int ST(int v) const { return st[v]; }
  555. };
  556.  
  557. -----
  558. template <class Item>
  559. class GQ
  560. {
  561. private:
  562. vector<Item> s; int N;
  563. public:
  564. GQ(int maxN) : s(maxN+1), N(0) { }
  565. int empty() const
  566. { return N == 0; }
  567. void put(Item item)
  568. { s[N++] = item; }
  569. void update(Item x) { }
  570. Item get()
  571. { int i = int(N*rand()/(1.0+RAND_MAX));
  572. Item t = s[i];
  573. s[i] = s[N-1];
  574. s[N-1] = t;
  575. return s[--N]; }
  576. };
  577.  
  578. ----------
  579. CHAPTER 19. Digraphs and DAGs
  580. -----
  581. template <class inGraph, class outGraph>
  582. void reverse(const inGraph &G, outGraph &R)
  583. {
  584. for (int v = 0; v < G.V(); v++)
  585. { typename inGraph::adjIterator A(G, v);
  586. for (int w = A.beg(); !A.end(); w = A.nxt())
  587. R.insert(Edge(w, v));
  588. }
  589. }
  590. -----
  591. template <class Graph> class DFS
  592. { const Graph &G;
  593. int depth, cnt, cntP;
  594. vector<int> pre, post;
  595. void show(char *s, Edge e)
  596. { for (int i = 0; i < depth; i++) cout << " ";
  597. cout << e.v << "-" << e.w << s << endl; }
  598. void dfsR(Edge e)
  599. { int w = e.w; show(" tree", e);
  600. pre[w] = cnt++; depth++;
  601. typename Graph::adjIterator A(G, w);
  602. for (int t = A.beg(); !A.end(); t = A.nxt())
  603. { Edge x(w, t);
  604. if (pre[t] == -1) dfsR(x);
  605. else if (post[t] == -1) show(" back", x);
  606. else if (pre[t] > pre[w]) show(" down", x);
  607. else show(" cross", x);
  608. }
  609. post[w] = cntP++; depth--;
  610. }
  611. public:
  612. DFS(const Graph &G) : G(G), cnt(0), cntP(0),
  613. pre(G.V(), -1), post(G.V(), -1)
  614. { for (int v = 0; v < G.V(); v++)
  615. if (pre[v] == -1) dfsR(Edge(v, v)); }
  616. };
  617. -----
  618. template <class tcGraph, class Graph> class TC
  619. { tcGraph T;
  620. public:
  621. TC(const Graph &G) : T(G)
  622. {
  623. for (int s = 0; s < T.V(); s++)
  624. T.insert(Edge(s, s));
  625. for (int i = 0; i < T.V(); i++)
  626. for (int s = 0; s < T.V(); s++)
  627. if (T.edge(s, i))
  628. for (int t = 0; t < T.V(); t++)
  629. if (T.edge(i, t))
  630. T.insert(Edge(s, t));
  631. }
  632. bool reachable(int s, int t) const
  633. { return T.edge(s, t); }
  634. };
  635. -----
  636. template <class Graph> class tc
  637. { Graph T; const Graph &G;
  638. void tcR(int v, int w)
  639. {
  640. T.insert(Edge(v, w));
  641. typename Graph::adjIterator A(G, w);
  642. for (int t = A.beg(); !A.end(); t = A.nxt())
  643. if (!T.edge(v, t)) tcR(v, t);
  644. }
  645. public:
  646. tc(const Graph &G) : G(G), T(G.V(), true)
  647. { for (int v = 0; v < G.V(); v++) tcR(v, v); }
  648. bool reachable(int v, int w)
  649. { return T.edge(v, w); }
  650. };
  651. -----
  652. int compressR(link h)
  653. { STx st;
  654. if (h == NULL) return 0;
  655. l = compressR(h->l);
  656. r = compressR(h->r);
  657. t = st.index(l, r);
  658. adj[t].l = l; adj[t].r = r;
  659. return t;
  660. }
  661. -----
  662. template <class Dag> class dagTS
  663. { const Dag &D;
  664. int cnt, tcnt;
  665. vector<int> pre, post, postI;
  666. void tsR(int v)
  667. {
  668. pre[v] = cnt++;
  669. typename Dag::adjIterator A(D, v);
  670. for (int t = A.beg(); !A.end(); t = A.nxt())
  671. if (pre[t] == -1) tsR(t);
  672. post[v] = tcnt; postI[tcnt++] = v;
  673. }
  674. public:
  675. dagTS(const Dag &D) : D(D), tcnt(0), cnt(0),
  676. pre(D.V(), -1), post(D.V(), -1), postI(D.V(), -1)
  677. { for (int v = 0; v < D.V(); v++)
  678. if (pre[v] == -1) tsR(v); }
  679. int operator[](int v) const { return postI[v]; }
  680. int relabel(int v) const { return post[v]; }
  681. };
  682. -----
  683. void tsR(int v)
  684. {
  685. pre[v] = cnt++;
  686. for (int w = 0; w < D.V(); w++)
  687. if (D.edge(w, v))
  688. if (pre[w] == -1) tsR(w);
  689. post[v] = tcnt; postI[tcnt++] = v;
  690. }
  691. -----
  692. #include "QUEUE.cc"
  693. template <class Dag> class dagTS
  694. { const Dag &D;
  695. vector<int> in, ts, tsI;
  696. public:
  697. dagTS(const Dag &D) : D(D),
  698. in(D.V(), 0), ts(D.V(), -1), tsI(D.V(), -1)
  699. { QUEUE<int> Q;
  700. for (int v = 0; v < D.V(); v++)
  701. {
  702. typename Dag::adjIterator A(D, v);
  703. for (int t = A.beg(); !A.end(); t = A.nxt())
  704. in[t]++;
  705. }
  706. for (int v = 0; v < D.V(); v++)
  707. if (in[v] == 0) Q.put(v);
  708. for (int j = 0; !Q.empty(); j++)
  709. {
  710. ts[j] = Q.get(); tsI[ts[j]] = j;
  711. typename Dag::adjIterator A(D, ts[j]);
  712. for (int t = A.beg(); !A.end(); t = A.nxt())
  713. if (--in[t] == 0) Q.put(t);
  714. }
  715. }
  716. int operator[](int v) const { return ts[v]; }
  717. int relabel(int v) const { return tsI[v]; }
  718. };
  719. -----
  720. template <class tcDag, class Dag> class dagTC
  721. { tcDag T; const Dag &D;
  722. int cnt;
  723. vector<int> pre;
  724. void tcR(int w)
  725. {
  726. pre[w] = cnt++;
  727. typename Dag::adjIterator A(D, w);
  728. for (int t = A.beg(); !A.end(); t = A.nxt())
  729. {
  730. T.insert(Edge(w, t));
  731. if (pre[t] > pre[w]) continue;
  732. if (pre[t] == -1) tcR(t);
  733. for (int i = 0; i < T.V(); i++)
  734. if (T.edge(t, i)) T.insert(Edge(w, i));
  735. }
  736. }
  737. public:
  738. dagTC(const Dag &D) : D(D), cnt(0),
  739. pre(D.V(), -1), T(D.V(), true)
  740. { for (int v = 0; v < D.V(); v++)
  741. if (pre[v] == -1) tcR(v); }
  742. bool reachable(int v, int w) const
  743. { return T.edge(v, w); }
  744. };
  745. -----
  746. template <class Graph> class SC
  747. { const Graph &G;
  748. int cnt, scnt;
  749. vector<int> postI, postR, id;
  750. void dfsR(const Graph &G, int w)
  751. {
  752. id[w] = scnt;
  753. typename Graph::adjIterator A(G, w);
  754. for (int t = A.beg(); !A.end(); t = A.nxt())
  755. if (id[t] == -1) dfsR(G, t);
  756. postI[cnt++] = w;
  757. }
  758. public:
  759. SC(const Graph &G) : G(G), cnt(0), scnt(0),
  760. postI(G.V()), postR(G.V()), id(G.V(), -1)
  761. { Graph R(G.V(), true);
  762. reverse(G, R);
  763. for (int v = 0; v < R.V(); v++)
  764. if (id[v] == -1) dfsR(R, v);
  765. postR = postI; cnt = scnt = 0;
  766. id.assign(G.V(), -1);
  767. for (int v = G.V()-1; v >= 0; v--)
  768. if (id[postR[v]] == -1)
  769. { dfsR(G, postR[v]); scnt++; }
  770. }
  771. int count() const { return scnt; }
  772. bool stronglyreachable(int v, int w) const
  773. { return id[v] == id[w]; }
  774. };
  775. -----
  776. #include "STACK.cc"
  777. template <class Graph> class SC
  778. { const Graph &G;
  779. STACK<int> S;
  780. int cnt, scnt;
  781. vector<int> pre, low, id;
  782. void scR(int w)
  783. { int t;
  784. int min = low[w] = pre[w] = cnt++;
  785. S.push(w);
  786. typename Graph::adjIterator A(G, w);
  787. for (t = A.beg(); !A.end(); t = A.nxt())
  788. {
  789. if (pre[t] == -1) scR(t);
  790. if (low[t] < min) min = low[t];
  791. }
  792. if (min < low[w]) { low[w] = min; return; }
  793. do
  794. { id[t = S.pop()] = scnt; low[t] = G.V(); }
  795. while (t != w);
  796. scnt++;
  797. }
  798. public:
  799. SC(const Graph &G) : G(G), cnt(0), scnt(0),
  800. pre(G.V(), -1), low(G.V()), id(G.V())
  801. { for (int v = 0; v < G.V(); v++)
  802. if (pre[v] == -1) scR(v); }
  803. int count() const { return scnt; }
  804. bool stronglyreachable(int v, int w) const
  805. { return id[v] == id[w]; }
  806. };
  807. -----
  808. void scR(int w)
  809. { int v;
  810. pre[w] = cnt++;
  811. S.push(w); path.push(w);
  812. typename Graph::adjIterator A(G, w);
  813. for (int t = A.beg(); !A.end(); t = A.nxt())
  814. if (pre[t] == -1) scR(t);
  815. else if (id[t] == -1)
  816. while (pre[path.top()] > pre[t]) path.pop();
  817. if (path.top() == w) path.pop(); else return;
  818. do { id[v = S.pop()] = scnt; } while (v != w);
  819. scnt++;
  820. }
  821. -----
  822. template <class Graph> class TC
  823. { const Graph &G; DenseGRAPH *K;
  824. dagTC<DenseGRAPH, Graph> *Ktc;
  825. SC<Graph> *Gsc;
  826. public:
  827. TC(const Graph &G) : G(G)
  828. {
  829. Gsc = new SC<Graph>(G);
  830. K = new DenseGRAPH(Gsc->count(), true);
  831. for (int v = 0; v < G.V(); v++)
  832. { typename Graph::adjIterator A(G, v);
  833. for (int t = A.beg(); !A.end(); t = A.nxt())
  834. K->insert(Edge(Gsc->ID(v), Gsc->ID(t))); }
  835. Ktc = new dagTC<DenseGRAPH, Graph>(*K);
  836. }
  837. ~TC() { delete K; delete Ktc; delete Gsc; }
  838. bool reachable(int v, int w)
  839. { return Ktc->reachable(Gsc->ID(v), Gsc->ID(w));}
  840. };
  841.  
  842. ----------
  843. CHAPTER 20. Minimum Spanning Trees
  844. -----
  845. class EDGE
  846. {
  847. public:
  848. EDGE(int, int, double);
  849. int v() const;
  850. int w() const;
  851. double wt() const;
  852. bool from(int) const;
  853. int other(int) const;
  854. };
  855. template <class Edge> class GRAPH
  856. {
  857. public:
  858. GRAPH(int, bool);
  859. ~GRAPH();
  860. int V() const;
  861. int E() const;
  862. bool directed() const;
  863. int insert(Edge *);
  864. int remove(Edge *);
  865. Edge *edge(int, int);
  866. class adjIterator
  867. {
  868. public:
  869. adjIterator(const GRAPH &, int);
  870. Edge *beg();
  871. Edge *nxt();
  872. bool end();
  873. };
  874. };
  875. -----
  876. template <class Graph, class Edge>
  877. vector <Edge *> edges(const Graph &G)
  878. { int E = 0;
  879. vector <Edge *> a(G.E());
  880. for (int v = 0; v < G.V(); v++)
  881. {
  882. typename Graph::adjIterator A(G, v);
  883. for (Edge* e = A.beg(); !A.end(); e = A.nxt())
  884. if (e->from(v)) a[E++] = e;
  885. }
  886. return a;
  887. }
  888. -----
  889. template <class Edge> class DenseGRAPH
  890. { int Vcnt, Ecnt; bool digraph;
  891. vector <vector <Edge *> > adj;
  892. public:
  893. DenseGRAPH(int V, bool digraph = false) :
  894. adj(V), Vcnt(V), Ecnt(0), digraph(digraph)
  895. {
  896. for (int i = 0; i < V; i++)
  897. adj[i].assign(V, 0);
  898. }
  899. int V() const { return Vcnt; }
  900. int E() const { return Ecnt; }
  901. bool directed() const { return digraph; }
  902. void insert(Edge *e)
  903. { int v = e->v(), w = e->w();
  904. if (adj[v][w] == 0) Ecnt++;
  905. adj[v][w] = e;
  906. if (!digraph) adj[w][v] = e;
  907. }
  908. void remove(Edge *e)
  909. { int v = e->v(), w = e->w();
  910. if (adj[v][w] != 0) Ecnt--;
  911. adj[v][w] = 0;
  912. if (!digraph) adj[w][v] = 0;
  913. }
  914. Edge* edge(int v, int w) const
  915. { return adj[v][w]; }
  916. class adjIterator;
  917. friend class adjIterator;
  918. };
  919. -----
  920. template <class Edge>
  921. class DenseGRAPH<Edge>::adjIterator
  922. { const DenseGRAPH<Edge> &G;
  923. int i, v;
  924. public:
  925. adjIterator(const DenseGRAPH<Edge> &G, int v) :
  926. G(G), v(v), i(0) { }
  927. Edge *beg()
  928. { i = -1; return nxt(); }
  929. Edge *nxt()
  930. {
  931. for (i++; i < G.V(); i++)
  932. if (G.edge(v, i)) return G.adj[v][i];
  933. return 0;
  934. }
  935. bool end() const
  936. { return i >= G.V(); }
  937. };
  938. -----
  939. template <class Edge> class SparseMultiGRAPH
  940. { int Vcnt, Ecnt; bool digraph;
  941. struct node
  942. { Edge* e; node* next;
  943. node(Edge* e, node* next): e(e), next(next) {}
  944. };
  945. typedef node* link;
  946. vector <link> adj;
  947. public:
  948. SparseMultiGRAPH(int V, bool digraph = false) :
  949. adj(V), Vcnt(V), Ecnt(0), digraph(digraph) { }
  950. int V() const { return Vcnt; }
  951. int E() const { return Ecnt; }
  952. bool directed() const { return digraph; }
  953. void insert(Edge *e)
  954. {
  955. adj[e->v()] = new node(e, adj[e->v()]);
  956. if (!digraph)
  957. adj[e->w()] = new node(e, adj[e->w()]);
  958. Ecnt++;
  959. }
  960. class adjIterator;
  961. friend class adjIterator;
  962. };
  963. -----
  964. template <class Graph, class Edge> class MST
  965. { const Graph &G;
  966. vector<double> wt;
  967. vector<Edge *> fr, mst;
  968. public:
  969. MST(const Graph &G) : G(G),
  970. mst(G.V()), wt(G.V(), G.V()), fr(G.V())
  971. { int min = -1;
  972. for (int v = 0; min != 0; v = min)
  973. {
  974. min = 0;
  975. for (int w = 1; w < G.V(); w++)
  976. if (mst[w] == 0)
  977. { double P; Edge* e = G.edge(v, w);
  978. if (e)
  979. if ((P = e->wt()) < wt[w])
  980. { wt[w] = P; fr[w] = e; }
  981. if (wt[w] < wt[min]) min = w;
  982. }
  983. if (min) mst[min] = fr[min];
  984. }
  985. }
  986. void show()
  987. { for (int v = 1; v < G.V(); v++)
  988. if (mst[v]) mst[v]->show();}
  989. };
  990. -----
  991. template <class Graph, class Edge> class MST
  992. { const Graph &G;
  993. vector<double> wt;
  994. vector<Edge *> fr, mst;
  995. void pfs(int s)
  996. { PQi<double> pQ(G.V(), wt);
  997. pQ.insert(s);
  998. while (!pQ.empty())
  999. { int v = pQ.getmin();
  1000. mst[v] = fr[v];
  1001. typename Graph::adjIterator A(G, v);
  1002. for (Edge* e = A.beg(); !A.end(); e = A.nxt())
  1003. { double P = e->wt(); int w = e->other(v);
  1004. if (fr[w] == 0)
  1005. { wt[w] = P; pQ.insert(w); fr[w] = e; }
  1006. else if (mst[w] == 0 && P < wt[w])
  1007. { wt[w] = P; pQ.lower(w); fr[w] = e; }
  1008. }
  1009. }
  1010. }
  1011. public:
  1012. MST(Graph &G) : G(G),
  1013. fr(G.V()), mst(G.V()), wt(G.V(), -1)
  1014. { for (int v = 0; v < G.V(); v++)
  1015. if (mst[v] == 0) pfs(v); }
  1016. };
  1017. -----
  1018. template <class Graph, class Edge, class EdgePtr>
  1019. class MST
  1020. { const Graph &G;
  1021. vector<EdgePtr> a, mst;
  1022. UF uf;
  1023. public:
  1024. MST(Graph &G) : G(G), uf(G.V()), mst(G.V())
  1025. { int V = G.V(), E = G.E();
  1026. a = edges<Graph, Edge, EdgePtr>(G);
  1027. sort<EdgePtr>(a, 0, E-1);
  1028. for (int i = 0, k = 1; i < E && k < V; i++)
  1029. if (!uf.find(a[i]->v, a[i]->w))
  1030. { uf.unite(a[i]->v, a[i]->w);
  1031. mst[k++] = a[i]; }
  1032. }
  1033. };
  1034. -----
  1035. template <class Graph, class Edge> class MST
  1036. { const Graph &G;
  1037. vector<Edge *> a, b, mst;
  1038. UF uf;
  1039. public:
  1040. MST(const Graph &G): G(G), uf(G.V()), mst(G.V()+1)
  1041. { a = edges<Graph, Edge>(G);
  1042. int N, k = 1;
  1043. for (int E = a.size(); E != 0; E = N)
  1044. { int h, i, j;
  1045. b.assign(G.V(), 0);
  1046. for (h = 0, N = 0; h < E; h++)
  1047. { Edge *e = a[h];
  1048. i = uf.find(e->v()), j = uf.find(e->w());
  1049. if (i == j) continue;
  1050. if (!b[i] || e->wt() < b[i]->wt()) b[i] = e;
  1051. if (!b[j] || e->wt() < b[j]->wt()) b[j] = e;
  1052. a[N++] = e;
  1053. }
  1054. for (h = 0; h < G.V(); h++)
  1055. if (b[h])
  1056. if (!uf.find(i = b[h]->v(), j = b[h]->w()))
  1057. { uf.unite(i, j); mst[k++] = b[h]; }
  1058. }
  1059. }
  1060. };
  1061. -----
  1062. template <class keyType> class PQi
  1063. { int d, N;
  1064. vector<int> pq, qp;
  1065. const vector<keyType> &a;
  1066. void exch(int i, int j)
  1067. { int t = pq[i]; pq[i] = pq[j]; pq[j] = t;
  1068. qp[pq[i]] = i; qp[pq[j]] = j; }
  1069. void fixUp(int k)
  1070. { while (k > 1 && a[pq[(k+d-2)/d]] > a[pq[k]])
  1071. { exch(k, (k+d-2)/d); k = (k+d-2)/d; } }
  1072. void fixDown(int k, int N)
  1073. { int j;
  1074. while ((j = d*(k-1)+2) <= N)
  1075. {
  1076. for (int i = j+1; i < j+d && i <= N; i++)
  1077. if (a[pq[j]] > a[pq[i]]) j = i;
  1078. if (!(a[pq[k]] > a[pq[j]])) break;
  1079. exch(k, j); k = j;
  1080. }
  1081. }
  1082. public:
  1083. PQi(int N, const vector<keyType> &a, int d = 3) :
  1084. a(a), pq(N+1, 0), qp(N+1, 0), N(0), d(d) { }
  1085. int empty() const { return N == 0; }
  1086. void insert(int v)
  1087. { pq[++N] = v; qp[v] = N; fixUp(N); }
  1088. int getmin()
  1089. { exch(1, N); fixDown(1, N-1); return pq[N--]; }
  1090. void lower(int k)
  1091. { fixUp(qp[k]); }
  1092. };
  1093.  
  1094. ----------
  1095. CHAPTER 21. Shortest Paths
  1096. -----
  1097. template <class Graph, class Edge> class SPT
  1098. { const Graph &G;
  1099. vector<double> wt;
  1100. vector<Edge *> spt;
  1101. public:
  1102. SPT(const Graph &G, int s) : G(G),
  1103. spt(G.V()), wt(G.V(), G.V())
  1104. { PQi<double> pQ(G.V(), wt);
  1105. for (int v = 0; v < G.V(); v++) pQ.insert(v);
  1106. wt[s] = 0.0; pQ.lower(s);
  1107. while (!pQ.empty())
  1108. { int v = pQ.getmin(); // wt[v] = 0.0;
  1109. if (v != s && spt[v] == 0) return;
  1110. typename Graph::adjIterator A(G, v);
  1111. for (Edge* e = A.beg(); !A.end(); e = A.nxt())
  1112. { int w = e->w();
  1113. double P = wt[v] + e->wt();
  1114. if (P < wt[w])
  1115. { wt[w] = P; pQ.lower(w); spt[w] = e; }
  1116. }
  1117. }
  1118. }
  1119. Edge *pathR(int v) const { return spt[v]; }
  1120. double dist(int v) const { return wt[v]; }
  1121. };
  1122. -----
  1123. template <class Graph, class Edge> class SPall
  1124. {
  1125. public:
  1126. SPall(const Graph &);
  1127. Edge *path(int, int) const;
  1128. Edge *pathR(int, int) const;
  1129. double dist(int, int) const;
  1130. };
  1131. -----
  1132. template <class Graph, class Edge>
  1133. double diameter(Graph &G)
  1134. { int vmax = 0, wmax = 0;
  1135. allSP<Graph, Edge> all(G);
  1136. for (int v = 0; v < G.V(); v++)
  1137. for (int w = 0; w < G.V(); w++)
  1138. if (all.path(v, w))
  1139. if (all.dist(v, w) > all.dist(vmax, wmax))
  1140. { vmax = v; wmax = w; }
  1141. int v = vmax; cout << v;
  1142. while (v != wmax)
  1143. { v = all.path(v, wmax)->w(); cout << "-" << v; }
  1144. return all.dist(vmax, wmax);
  1145. }
  1146. -----
  1147. #include "SPT.cc"
  1148. template <class Graph, class Edge> class allSP
  1149. { const Graph &G;
  1150. vector< SPT<Graph, Edge> *> A;
  1151. public:
  1152. allSP(const Graph &G) : G(G), A(G.V())
  1153. { for (int s = 0; s < G.V(); s++)
  1154. A[s] = new SPT<Graph, Edge>(G, s); }
  1155. Edge *pathR(int s, int t) const
  1156. { return A[s]->pathR(t); }
  1157. double dist(int s, int t) const
  1158. { return A[s]->dist(t); }
  1159. };
  1160. -----
  1161. template <class Graph, class Edge> class allSP
  1162. { const Graph &G;
  1163. vector <vector <Edge *> > p;
  1164. vector <vector <double> > d;
  1165. public:
  1166. allSP(const Graph &G) : G(G), p(G.V()), d(G.V())
  1167. { int V = G.V();
  1168. for (int i = 0; i < V; i++)
  1169. { p[i].assign(V, 0); d[i].assign(V, V); }
  1170. for (int s = 0; s < V; s++)
  1171. for (int t = 0; t < V; t++)
  1172. if (G.edge(s, t))
  1173. { p[s][t] = G.edge(s, t);
  1174. d[s][t] = G.edge(s, t)->wt(); }
  1175. for (int s = 0; s < V; s++) d[s][s] = 0;
  1176. for (int i = 0; i < V; i++)
  1177. for (int s = 0; s < V; s++)
  1178. if (p[s][i])
  1179. for (int t = 0; t < V; t++)
  1180. if (s != t)
  1181. if (d[s][t] > d[s][i] + d[i][t])
  1182. { p[s][t] = p[s][i];
  1183. d[s][t] = d[s][i] + d[i][t]; }
  1184. }
  1185. Edge *path(int s, int t) const
  1186. { return p[s][t]; }
  1187. double dist(int s, int t) const
  1188. { return d[s][t]; }
  1189. };
  1190. -----
  1191. #include "dagTS.cc"
  1192. template <class Graph, class Edge> class LPTdag
  1193. { const Graph &G;
  1194. vector<double> wt;
  1195. vector<Edge *> lpt;
  1196. public:
  1197. LPTdag(const Graph &G) : G(G),
  1198. lpt(G.V()), wt(G.V(), 0)
  1199. { int j, w;
  1200. dagTS<Graph> ts(G);
  1201. for (int v = ts[j = 0]; j < G.V(); v = ts[++j])
  1202. { typename Graph::adjIterator A(G, v);
  1203. for (Edge* e = A.beg(); !A.end(); e = A.nxt())
  1204. if (wt[w = e->w()] < wt[v] + e->wt())
  1205. { wt[w] = wt[v] + e->wt(); lpt[w] = e; }
  1206. }
  1207. }
  1208. Edge *pathR(int v) const { return lpt[v]; }
  1209. double dist(int v) const { return wt[v]; }
  1210. };
  1211. -----
  1212. template <class Graph, class Edge> class allSPdag
  1213. { const Graph &G;
  1214. vector <vector <Edge *> > p;
  1215. vector <vector <double> > d;
  1216. void dfsR(int s)
  1217. { typename Graph::adjIterator A(G, s);
  1218. for (Edge* e = A.beg(); !A.end(); e = A.nxt())
  1219. { int t = e->w(); double w = e->wt();
  1220. if (d[s][t] > w)
  1221. { d[s][t] = w; p[s][t] = e; }
  1222. if (p[t][t] == 0) dfsR(t);
  1223. for (int i = 0; i < G.V(); i++)
  1224. if (p[t][i])
  1225. if (d[s][i] > w + d[t][i])
  1226. { d[s][i] = w + d[t][i]; p[s][i] = e; }
  1227. }
  1228. }
  1229. public:
  1230. allSPdag(const Graph &G) : G(G),
  1231. p(G.V()), d(G.V())
  1232. { int V = G.V();
  1233. for (int i = 0; i < V; i++)
  1234. { p[i].assign(V, 0); d[i].assign(V, V); }
  1235. for (int s = 0; s < V; s++)
  1236. if (p[s][s] == 0) dfsR(s);
  1237. }
  1238. Edge *path(int s, int t) const
  1239. { return p[s][t]; }
  1240. double dist(int s, int t) const
  1241. { return d[s][t]; }
  1242. };
  1243. -----
  1244. #include "GRAPHbasic.cc"
  1245. #include "GRAPHio.cc"
  1246. #include "LPTdag.cc"
  1247. typedef WeightedEdge EDGE;
  1248. typedef DenseGRAPH<EDGE> GRAPH;
  1249. int main(int argc, char *argv[])
  1250. { int i, s, t, N = atoi(argv[1]);
  1251. double duration[N];
  1252. GRAPH G(N, true);
  1253. for (int i = 0; i < N; i++)
  1254. cin >> duration[i];
  1255. while (cin >> s >> t)
  1256. G.insert(new EDGE(s, t, duration[s]));
  1257. LPTdag<GRAPH, EDGE> lpt(G);
  1258. for (i = 0; i < N; i++)
  1259. cout << i << " " << lpt.dist(i) << endl;
  1260. }
  1261. -----
  1262. SPT(Graph &G, int s) : G(G),
  1263. spt(G.V()), wt(G.V(), G.V())
  1264. { QUEUE<int> Q; int N = 0;
  1265. wt[s] = 0.0;
  1266. Q.put(s); Q.put(G.V());
  1267. while (!Q.empty())
  1268. { int v;
  1269. while ((v = Q.get()) == G.V())
  1270. { if (N++ > G.V()) return; Q.put(G.V()); }
  1271. typename Graph::adjIterator A(G, v);
  1272. for (Edge* e = A.beg(); !A.end(); e = A.nxt())
  1273. { int w = e->w();
  1274. double P = wt[v] + e->wt();
  1275. if (P < wt[w])
  1276. { wt[w] = P; Q.put(w); spt[w] = e; }
  1277. }
  1278. }
  1279. }
  1280.  
  1281. ----------
  1282. CHAPTER 22. Network Flow
  1283. -----
  1284. template <class Graph, class Edge> class check
  1285. {
  1286. public:
  1287. static int flow(Graph &G, int v)
  1288. { int x = 0;
  1289. typename Graph::adjIterator A(G, v);
  1290. for (Edge* e = A.beg(); !A.end(); e = A.nxt())
  1291. x += e->from(v) ? e->flow() : -e->flow();
  1292. return x;
  1293. }
  1294. static bool flow(Graph &G, int s, int t)
  1295. {
  1296. for (int v = 0; v < G.V(); v++)
  1297. if ((v != s) && (v != t))
  1298. if (flow(G, v) != 0) return false;
  1299. int sflow = flow(G, s);
  1300. if (sflow < 0) return false;
  1301. if (sflow + flow(G, t) != 0) return false;
  1302. return true;
  1303. }
  1304. };
  1305. -----
  1306. class EDGE
  1307. { int pv, pw, pcap, pflow;
  1308. public:
  1309. EDGE(int v, int w, int cap) :
  1310. pv(v), pw(w), pcap(cap), pflow(0) { }
  1311. int v() const { return pv; }
  1312. int w() const { return pw; }
  1313. int cap() const { return pcap; }
  1314. int flow() const { return pflow; }
  1315. bool from (int v) const
  1316. { return pv == v; }
  1317. int other(int v) const
  1318. { return from(v) ? pw : pv; }
  1319. int capRto(int v) const
  1320. { return from(v) ? pflow : pcap - pflow; }
  1321. void addflowRto(int v, int d)
  1322. { pflow += from(v) ? -d : d; }
  1323. };
  1324. -----
  1325. template <class Graph, class Edge> class MAXFLOW
  1326. { const Graph &G;
  1327. int s, t;
  1328. vector<int> wt;
  1329. vector<Edge *> st;
  1330. int ST(int v) const { return st[v]->other(v); }
  1331. void augment(int s, int t)
  1332. { int d = st[t]->capRto(t);
  1333. for (int v = ST(t); v != s; v = ST(v))
  1334. if (st[v]->capRto(v) < d)
  1335. d = st[v]->capRto(v);
  1336. st[t]->addflowRto(t, d);
  1337. for (int v = ST(t); v != s; v = ST(v))
  1338. st[v]->addflowRto(v, d);
  1339. }
  1340. bool pfs();
  1341. public:
  1342. MAXFLOW(const Graph &G, int s, int t) : G(G),
  1343. s(s), t(t), st(G.V()), wt(G.V())
  1344. { while (pfs()) augment(s, t); }
  1345. };
  1346. -----
  1347. template <class Graph, class Edge>
  1348. bool MAXFLOW<Graph, Edge>::pfs()
  1349. { PQi<int> pQ(G.V(), wt);
  1350. for (int v = 0; v < G.V(); v++)
  1351. { wt[v] = 0; st[v] = 0; pQ.insert(v); }
  1352. wt[s] = -M; pQ.lower(s);
  1353. while (!pQ.empty())
  1354. { int v = pQ.getmin(); wt[v] = -M;
  1355. if (v == t || (v != s && st[v] == 0)) break;
  1356. typename Graph::adjIterator A(G, v);
  1357. for (Edge* e = A.beg(); !A.end(); e = A.nxt())
  1358. { int w = e->other(v);
  1359. int cap = e->capRto(w);
  1360. int P = cap < -wt[v] ? cap : -wt[v];
  1361. if (cap > 0 && -P < wt[w])
  1362. { wt[w] = -P; pQ.lower(w); st[w] = e; }
  1363. }
  1364. }
  1365. return st[t] != 0;
  1366. }
  1367. -----
  1368. template <class Graph, class Edge> class MAXFLOW
  1369. { const Graph &G;
  1370. int s, t;
  1371. vector<int> h, wt;
  1372. void initheights();
  1373. public:
  1374. MAXFLOW(const Graph &G, int s, int t) : G(G),
  1375. s(s), t(t), h(G.V()), wt(G.V(), 0)
  1376. { initheights();
  1377. GQ gQ(G.V());
  1378. gQ.put(s); wt[t] = -(wt[s] = M*G.V());
  1379. while (!gQ.empty())
  1380. { int v = gQ.get();
  1381. typename Graph::adjIterator A(G, v);
  1382. for (Edge* e = A.beg(); !A.end(); e = A.nxt())
  1383. { int w = e->other(v);
  1384. int cap = e->capRto(w);
  1385. int P = cap < wt[v] ? cap : wt[v];
  1386. if (P > 0 && v == s || h[v] == h[w]+1)
  1387. { e->addflowRto(w, P);
  1388. wt[v] -= P; wt[w] += P;
  1389. if ((w != s) && (w != t)) gQ.put(w); }
  1390. }
  1391. if (v != s && v != t && wt[v] > 0)
  1392. { h[v]++; gQ.put(v); }
  1393. }
  1394. }
  1395. };
  1396. -----
  1397. #include "MAXFLOW.cc"
  1398. template <class Graph, class Edge> class FEASIBLE
  1399. { const Graph &G;
  1400. void freeedges(const Graph &F, int v)
  1401. { typename Graph::adjIterator A(F, v);
  1402. for (EDGE* e = A.beg(); !A.end(); e = A.nxt())
  1403. delete e;
  1404. }
  1405. public:
  1406. FEASIBLE(const Graph &G, vector<int> sd) : G(G)
  1407. {
  1408. Graph F(G.V()+2);
  1409. for (int v = 0; v < G.V(); v++)
  1410. {
  1411. typename Graph::adjIterator A(G, v);
  1412. for (EDGE* e = A.beg(); !A.end(); e = A.nxt())
  1413. F.insert(e);
  1414. }
  1415. int s = G.V(), t = G.V()+1;
  1416. for (int i = 0; i < G.V(); i++)
  1417. if (sd[i] >= 0)
  1418. F.insert(new EDGE(s, i, sd[i]));
  1419. else
  1420. F.insert(new EDGE(i, t, -sd[i]));
  1421. MAXFLOW<Graph, Edge>(F, s, t);
  1422. freeedges(F, s); freeedges(F, t);
  1423. }
  1424. };
  1425. -----
  1426. #include "GRAPHbasic.cc"
  1427. #include "MAXFLOW.cc"
  1428. int main(int argc, char *argv[])
  1429. { int s, t, N = atoi(argv[1]);
  1430. GRAPH<EDGE> G(2*N+2);
  1431. for (int i = 0; i < N; i++)
  1432. G.insert(new EDGE(2*N, i, 1));
  1433. while (cin >> s >> t)
  1434. G.insert(new EDGE(s, t, 1));
  1435. for (int i = N; i < 2*N; i++)
  1436. G.insert(new EDGE(i, 2*N+1, 1));
  1437. MAXFLOW<GRAPH<EDGE>, EDGE>(G, 2*N, 2*N+1);
  1438. for (int i = 0; i < N; i++)
  1439. {
  1440. GRAPH<EDGE>::adjIterator A(G, i);
  1441. for (EDGE* e = A.beg(); !A.end(); e = A.nxt())
  1442. if (e->flow() == 1 && e->from(i))
  1443. cout << e->v() << "-" << e->w() << endl;
  1444. }
  1445.  
  1446. }
  1447. -----
  1448. static int cost(Graph &G)
  1449. { int x = 0;
  1450. for (int v = 0; v < G.V(); v++)
  1451. {
  1452. typename Graph::adjIterator A(G, v);
  1453. for (Edge* e = A.beg(); !A.end(); e = A.nxt())
  1454. if (e->from(v) && e->costRto(e->w()) < C)
  1455. x += e->flow()*e->costRto(e->w());
  1456. }
  1457. return x;
  1458. }
  1459. -----
  1460. template <class Graph, class Edge> class MINCOST
  1461. { const Graph &G;
  1462. int s, t;
  1463. vector<int> wt;
  1464. vector <Edge *> st;
  1465. int ST(int v) const;
  1466. void augment(int, int);
  1467. int negcyc(int);
  1468. int negcyc();
  1469. public:
  1470. MINCOST(const Graph &G, int s, int t) : G(G),
  1471. s(s), t(t), st(G.V()), wt(G.V())
  1472. { MAXFLOW<Graph, Edge>(G, s, t);
  1473. for (int x = negcyc(); x != -1; x = negcyc())
  1474. { augment(x, x); }
  1475. }
  1476. };
  1477. -----
  1478. int phiR(int v)
  1479. {
  1480. if (mark[v] == valid) return phi[v];
  1481. phi[v] = phiR(ST(v)) - st[v]->costRto(v);
  1482. mark[v] = valid;
  1483. return phi[v];
  1484. }
  1485. -----
  1486. int lca(int v, int w)
  1487. { mark[v] = ++valid; mark[w] = valid;
  1488. while (v != w)
  1489. {
  1490. if (v != t) v = ST(v);
  1491. if (v != t && mark[v] == valid) return v;
  1492. mark[v] = valid;
  1493. if (w != t) w = ST(w);
  1494. if (w != t && mark[w] == valid) return w;
  1495. mark[w] = valid;
  1496. }
  1497. return v;
  1498. }
  1499. Edge *augment(Edge *x)
  1500. { int v = x->v(), w = x->w(); int r = lca(v, w);
  1501. int d = x->capRto(w);
  1502. for (int u = w; u != r; u = ST(u))
  1503. if (st[u]->capRto(ST(u)) < d)
  1504. d = st[u]->capRto(ST(u));
  1505. for (int u = v; u != r; u = ST(u))
  1506. if (st[u]->capRto(u) < d)
  1507. d = st[u]->capRto(u);
  1508. x->addflowRto(w, d); Edge* e = x;
  1509. for (int u = w; u != r; u = ST(u))
  1510. { st[u]->addflowRto(ST(u), d);
  1511. if (st[u]->capRto(ST(u)) == 0) e = st[u]; }
  1512. for (int u = v; u != r; u = ST(u))
  1513. { st[u]->addflowRto(u, d);
  1514. if (st[u]->capRto(u) == 0) e = st[u]; }
  1515. return e;
  1516. }
  1517. -----
  1518. bool onpath(int a, int b, int c)
  1519. {
  1520. for (int i = a; i != c; i = ST(i))
  1521. if (i == b) return true;
  1522. return false;
  1523. }
  1524. void reverse(int u, int x)
  1525. { Edge *e = st[u];
  1526. for (int i = ST(u); i != x; i = ST(i))
  1527. { Edge *y = st[i]; st[i] = e; e = y; }
  1528. }
  1529. void update(Edge *w, Edge *y)
  1530. { int u = y->w(), v = y->v(), x = w->w();
  1531. if (st[x] != w) x = w->v();
  1532. int r = lca(u, v);
  1533. if (onpath(u, x, r))
  1534. { reverse(u, x); st[u] = y; return; }
  1535. if (onpath(v, x, r))
  1536. { reverse(v, x); st[v] = y; return; }
  1537. }
  1538. -----
  1539. int costR(Edge *e, int v)
  1540. { int R = e->cost() + phi[e->w()] - phi[e->v()];
  1541. return e->from(v) ? R : -R; }
  1542. Edge *besteligible()
  1543. { Edge *x = 0;
  1544. for (int v = 0, min = C*G.V(); v < G.V(); v++)
  1545. {
  1546. typename Graph::adjIterator A(G, v);
  1547. for (Edge* e = A.beg(); !A.end(); e = A.nxt())
  1548. if (e->capRto(e->other(v)) > 0)
  1549. if (e->capRto(v) == 0)
  1550. if (costR(e, v) < min)
  1551. { x = e; min = costR(e, v); }
  1552. }
  1553. return x;
  1554. }
  1555. -----
  1556. template <class Graph, class Edge> class MINCOST
  1557. { const Graph &G; int s, t; int valid;
  1558. vector<Edge *> st; vector<int> mark, phi;
  1559. void dfsR(Edge);
  1560. int ST(int);
  1561. int phiR(int);
  1562. int lca(int, int); Edge *augment(Edge *);
  1563. bool onpath(int, int, int);
  1564. void reverse(int, int);
  1565. void update(Edge *, Edge *);
  1566. int costR(Edge *, int); Edge *besteligible();
  1567. public:
  1568. MINCOST(Graph &G, int s, int t) : G(G), s(s), t(t)
  1569. st(G.V()), mark(G.V(), -1), phi(G.V())
  1570. {
  1571. Edge *z = new EDGE(s, t, M*G.V(), C*G.V());
  1572. G.insert(z);
  1573. z->addflowto(t, z->cap());
  1574. dfsR(z);
  1575. for (valid = 1; ; valid++ )
  1576. {
  1577. phi[t] = z->costRto(s); mark[t] = valid;
  1578. for (int v = 0; v < G.V(); v++)
  1579. if (v != t) phi[v] = phiR(v);
  1580. Edge *x = besteligible();
  1581. if (costR(x, x->v()) == 0) break;
  1582. update(augment(x), x);
  1583. }
  1584. G.remove(z); delete z;
  1585. }
  1586. -----
  1587. int old = 0;
  1588. for (valid = 1; valid != old; )
  1589. {
  1590. old = valid;
  1591. for (int v = 0; v < G.V(); v++)
  1592. {
  1593. typename Graph::adjIterator A(G, v);
  1594. for (Edge* e = A.beg(); !A.end(); e = A.nxt())
  1595. if (e->capRto(e->other(v)) > 0)
  1596. if (e->capRto(v) == 0)
  1597. { update(augment(e), e); valid++; }
  1598. }
  1599. }
Add Comment
Please, Sign In to add comment