Advertisement
Guest User

ololo

a guest
Nov 22nd, 2014
126
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.70 KB | None | 0 0
  1. import java.io.*;
  2. import java.util.*;
  3.  
  4. public class ProbC {
  5. boolean eof;
  6.  
  7. public static void main(String[] args) throws IOException {
  8. new ProbC().run();
  9. }
  10.  
  11. String next() {
  12. while (st == null || !st.hasMoreTokens()) {
  13. try {
  14. st = new StringTokenizer(br.readLine());
  15. } catch (Exception e) {
  16. eof = true;
  17. return "-1";
  18. }
  19. }
  20. return st.nextToken();
  21. }
  22.  
  23. BufferedReader br;
  24. StringTokenizer st;
  25. PrintWriter out;
  26.  
  27. int nextInt() {
  28. return Integer.parseInt(next());
  29. }
  30.  
  31. void run() throws IOException {
  32. String name = "cut";
  33. InputStream input = System.in;
  34. OutputStream output = System.out;
  35. try {
  36. File f = new File(name + ".in");
  37. if (f.exists() && f.canRead()) {
  38. input = new FileInputStream(f);
  39. output = new FileOutputStream(name + ".out");
  40. }
  41. } catch (Exception e) {
  42. }
  43.  
  44. br = new BufferedReader(new InputStreamReader(input));
  45. out = new PrintWriter(output);
  46.  
  47. solve();
  48.  
  49. br.close();
  50. out.close();
  51. }
  52.  
  53. boolean bfs(int cap) {
  54. q.clear();
  55. q.add(0);
  56.  
  57. int n = edges.length;
  58. Arrays.fill(d, Integer.MAX_VALUE);
  59. d[0] = 0;
  60. while (!q.isEmpty() && d[n - 1] == Integer.MAX_VALUE) {
  61. int u = q.remove();
  62. for (Edge e : edges[u]) {
  63. if (e.f + cap <= e.c && d[u] + 1 < d[e.v]) {
  64. d[e.v] = d[u] + 1;
  65. q.add(e.v);
  66. }
  67. }
  68. }
  69.  
  70. return d[n - 1] < Integer.MAX_VALUE;
  71. }
  72.  
  73. Queue<Integer> q;
  74. int[] d;
  75. ArrayList<Edge>[] edges;
  76. int[] start;
  77.  
  78. int dfs(int u, int sink, int flow) {
  79. if (u == sink) {
  80. return flow;
  81. }
  82.  
  83. for (; start[u] < edges[u].size(); ) {
  84. Edge e = edges[u].get(start[u]++);
  85. if (d[u] + 1 == d[e.v] && e.f < e.c) {
  86. int res = dfs(e.v, sink, Math.min(flow, e.c - e.f));
  87. if (res > 0) {
  88. e.f += res;
  89. e.rev.f -= res;
  90. return res;
  91. }
  92. }
  93. }
  94.  
  95. return 0;
  96. }
  97.  
  98. void solve() {
  99. int n = nextInt();
  100. int m = nextInt();
  101.  
  102. edges = new ArrayList[n];
  103. for (int i = 0; i < n; ++i) {
  104. edges[i] = new ArrayList<>();
  105. }
  106.  
  107. for (int i = 0; i < m; ++i) {
  108. int u = nextInt() - 1;
  109. int v = nextInt() - 1;
  110. int c = nextInt();
  111.  
  112. Edge e = new Edge(u, v, c);
  113. Edge rev = new Edge(v, u, 0);
  114. e.rev = rev;
  115. rev.rev = e;
  116. edges[u].add(e);
  117. edges[v].add(rev);
  118. }
  119.  
  120. d = new int[n];
  121. q = new ArrayDeque<>();
  122. start = new int[n];
  123. for (int cap = 1 << 29; cap > 0; cap >>= 1) {
  124. while (bfs(cap)) {
  125. Arrays.fill(start, 0);
  126. while (dfs(0, n - 1, Integer.MAX_VALUE) > 0) {
  127. }
  128. }
  129. }
  130.  
  131. bfs(1);
  132. out.println(Arrays.stream(d).filter(i -> i < Integer.MAX_VALUE).count());
  133. Arrays.stream(d).filter(d -> d < Integer.MAX_VALUE).forEach(d -> out.print((d + 1) + " "));
  134. out.println();
  135. }
  136.  
  137. class Edge {
  138. int u;
  139. int v;
  140. int c;
  141. int f;
  142. Edge rev;
  143.  
  144. Edge(int u, int v, int c) {
  145. this.u = u;
  146. this.v = v;
  147. this.c = c;
  148. f = 0;
  149. }
  150. }
  151. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement