Guest User

Untitled

a guest
Sep 25th, 2018
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.60 KB | None | 0 0
  1. import sys
  2.  
  3. def load_edges(fname):
  4. f = open(fname,"r");
  5. edge_list = []
  6. maxv = 0
  7. for line in f:
  8. n1, n2 = map(int, line.split())
  9. edge_list.append([ n1, n2 ])
  10. return edge_list
  11.  
  12. class Graph:
  13.  
  14. def __init__(self, edge_list):
  15.  
  16. vlist = []
  17. self.maxv = 0
  18. for edge in edge_list:
  19. self.maxv = max(self.maxv, edge[0], edge[1])
  20.  
  21. self.adj = []
  22. for v in xrange(self.maxv + 1):
  23. self.adj.append([])
  24.  
  25. for edge in edge_list:
  26. self.adj[edge[0]].append(edge[1])
  27.  
  28. def vlist(self):
  29. return xrange(0, self.maxv + 1)
  30.  
  31.  
  32. class SccAlgo:
  33.  
  34. def __init__(self, edge_list):
  35. self.edge_list = edge_list
  36.  
  37. def reverse_edges(self):
  38. rlist = []
  39. for edge in self.edge_list:
  40. rlist.append([edge[1], edge[0]])
  41. return rlist
  42.  
  43. def dfs(self, graph, i):
  44. self.leader[i] = self.s
  45. self.explored[i] = True
  46. for j in graph.adj[i]:
  47. if not self.explored[j]:
  48. self.dfs(graph, j)
  49. self.t += 1
  50. self.finish[i] = self.t
  51.  
  52.  
  53. def dfs_loop(self, graph):
  54. print "clear"
  55. self.t = 0
  56. self.s = 0
  57. for i in graph.vlist():
  58. self.explored[i] = False
  59. self.leader[i] = 0
  60. self.finish[i] = 0
  61. print "start exploration"
  62. for i in xrange(graph.maxv, 0, -1):
  63. #print "explore "+str(i)
  64. if not self.explored[i]:
  65. self.s = i
  66. self.dfs(graph, i)
  67. print "end exploration"
  68.  
  69. def first_pass(self):
  70. graph = Graph(self.reverse_edges())
  71. self.explored = [ False ] * (graph.maxv + 1)
  72. self.leader = [ 0 ] * (graph.maxv + 1)
  73. self.finish = [ 0 ] * (graph.maxv + 1)
  74. self.dfs_loop(graph)
  75.  
  76. def second_pass(self):
  77.  
  78. renamed = []
  79. for edge in self.edge_list:
  80. renamed.append([ self.finish[edge[0]], self.finish[edge[1]]])
  81.  
  82. graph = Graph(renamed)
  83. self.dfs_loop(graph)
  84.  
  85. def debug(self):
  86. for i in range(len(self.explored)):
  87. print i, self.explored[i], self.leader[i], self.finish[i]
  88.  
  89. def stats(self):
  90. stats = dict()
  91. for i in range(len(self.leader)):
  92. key = self.leader[i]
  93. stats[key] = stats.setdefault(key, 0) + 1
  94. print stats
  95.  
  96.  
  97. sys.setrecursionlimit(32800)
  98. print sys.getrecursionlimit()
  99.  
  100. algo = SccAlgo(load_edges("SCC.txt"))
  101. print "first pass"
  102. algo.first_pass()
  103. #algo.debug()
  104. #print "second pass"
  105. #algo.second_pass()
  106. #algo.debug()
  107. #algo.stats()
Add Comment
Please, Sign In to add comment