Advertisement
Guest User

Untitled

a guest
May 6th, 2015
214
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.12 KB | None | 0 0
  1. package main;
  2.  
  3. import java.util.ArrayList;
  4. import java.util.HashSet;
  5. import java.util.List;
  6. import java.util.Scanner;
  7. import java.util.Set;
  8. import java.util.Stack;
  9.  
  10. public class GraphBase {
  11.  
  12. private static class Vertex {
  13. public int time, comp, low, n;
  14. public List<Vertex> lst;
  15.  
  16. public Vertex(int count, int n_) {
  17. lst = new ArrayList<>(count);
  18. n = n_;
  19. }
  20. }
  21.  
  22. private static int count = 1, time = 1;
  23. private static List<Set<Vertex>> stv;
  24.  
  25. private static void tarjan(List<Vertex> g) {
  26. Stack<Vertex> s = new Stack<Vertex>();
  27. for (Vertex i : g)
  28. if (i.time == 0)
  29. visitVertexTarjan(g, i, s);
  30. }
  31.  
  32. private static void visitVertexTarjan(List<Vertex> g, Vertex v,
  33. Stack<Vertex> s) {
  34. v.time = v.low = time++;
  35. s.push(v);
  36. for (Vertex i : v.lst) {
  37. if (i.time == 0)
  38. visitVertexTarjan(g, i, s);
  39. if (i.comp == 0 && v.low > i.low)
  40. v.low = i.low;
  41. }
  42. if (v.time == v.low) {
  43. Vertex u;
  44. stv.add(new HashSet<Vertex>());
  45. do {
  46. u = s.pop();
  47. u.comp = count;
  48. stv.get(count - 1).add(u);
  49. } while (u != v);
  50. count++;
  51. }
  52. }
  53.  
  54. public static void main(String[] args) {
  55. Scanner in = new Scanner(System.in);
  56. int n, m;
  57. n = in.nextInt();
  58. m = in.nextInt();
  59. List<Vertex> g = new ArrayList<>(n);
  60. stv = new ArrayList<Set<Vertex>>();
  61. for (int i = 0; i < n; i++)
  62. g.add(new Vertex(50, i));
  63. for (int i = 0; i < m; i++) {
  64. int a, b;
  65. a = in.nextInt();
  66. b = in.nextInt();
  67. g.get(a).lst.add(g.get(b));
  68. }
  69. tarjan(g);
  70. List<Vertex> cg = new ArrayList<>(stv.size());
  71. for (int i = 0; i < stv.size(); i++)
  72. cg.add(new Vertex(stv.size(), i));
  73. for (Set<Vertex> i : stv) {
  74. for (Vertex v : i) {
  75. for (Vertex u : v.lst) {
  76. if (v.comp != u.comp) {
  77. if (cg.get(v.comp - 1).lst.indexOf(cg.get(u.comp - 1)) == -1) {
  78. cg.get(v.comp - 1).lst.add(cg.get(u.comp - 1));
  79. cg.get(u.comp - 1).time++;
  80. }
  81. }
  82. }
  83. }
  84. }
  85. for(Vertex v : cg)
  86. if(v.time == 0) {
  87. int min = n + 1;
  88. for(Vertex u : stv.get(v.n))
  89. if(u.n < min)
  90. min = u.n;
  91. System.out.print(min + " ");
  92. }
  93. }
  94. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement