Advertisement
Guest User

Untitled

a guest
Mar 24th, 2017
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.20 KB | None | 0 0
  1. # -*- coding: utf-8 -*-
  2.  
  3.  
  4. def makeAdjAndAdjT(arr, n):
  5.     adj = [[] for i in range(n)]
  6.     adjT = [[] for i in range(n)]
  7.     for i in arr:
  8.         adj[i[0]].append(i[1])
  9.         adjT[i[1]].append(i[0])
  10.     return [sorted(i) for i in adj], [sorted(i) for i in adjT]
  11.  
  12.  
  13. def myDfs(adj, n):
  14.     arr = []
  15.     used = [False for i in range(n)]
  16.     stackDfs = []
  17.  
  18.     while stackDfs or (False in used):
  19.         if not stackDfs:
  20.             for i in range(len(used)):
  21.                 if not used[i]:
  22.                     stackDfs.append(i)
  23.                     used[i] = True
  24.                     break
  25.  
  26.         deadlock = True
  27.         for v in adj[stackDfs[-1]]:
  28.             if not used[v]:
  29.                 stackDfs.append(v)
  30.                 used[v] = True
  31.                 deadlock = False
  32.                 break
  33.  
  34.         if deadlock:
  35.             arr.append(stackDfs.pop())
  36.     return arr
  37.  
  38.  
  39. def getComponents(adjT, stepOne):
  40.     stepOne.reverse()
  41.     componentsArr = [-1 for i in range(len(stepOne))]
  42.     used = [False for i in range(n)]
  43.     stack = []
  44.     color = 0
  45.  
  46.     while stack or (False in used):
  47.         if not stack:
  48.             color += 1
  49.             for i in stepOne:
  50.                 if not used[i]:
  51.                     stack.append(i)
  52.                     componentsArr[i] = color
  53.                     used[i] = True
  54.                     break
  55.  
  56.         deadlock = True
  57.         for v in adjT[stack[-1]]:
  58.             if not used[v]:
  59.                 stack.append(v)
  60.                 used[v] = True
  61.                 componentsArr[v] = color
  62.                 deadlock = False
  63.                 break
  64.  
  65.         if deadlock:
  66.             stack.pop()
  67.     return componentsArr
  68.  
  69.  
  70. if __name__ == '__main__':
  71.     # Алгоритм Косарайю
  72.     n = 6
  73.     arr = [[0, 1], [0, 4], [1, 0], [1, 2], [2, 3], [2, 5], [4, 1], [5, 3], [5, 4]]
  74.     adj, adjT = makeAdjAndAdjT(arr, n)
  75.  
  76.     stepOne = myDfs(adj, n)
  77.  
  78.     colors = getComponents(adjT, stepOne)
  79.     components = [[] for i in range(max(colors))]
  80.     for i, item in enumerate(colors):
  81.         components[item-1].append(i)
  82.  
  83.     print("Компоненты сильной связности:")
  84.  
  85.     for i in components:
  86.         print(i)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement