Create grader.py

This commit is contained in:
Ankur Sundara 2017-03-12 00:29:28 -06:00 committed by GitHub
parent 23125c60af
commit 2910645c96

112
library2/grader.py Normal file
View file

@ -0,0 +1,112 @@
N = input()
dictionary = {}
word_idx = {}
for i in range(N):
line = raw_input()
sp = line.split(": ")
word = sp[0]
defn = sp[1].split(" ")
dictionary[word] = defn
word_idx[word] = i
#print dictionary
graph = {} #adj-list graph of word dependencies
for i in range(N):
graph[i] = []
for word in dictionary:
idx = word_idx[word]
for dword in dictionary[word]:
toidx = word_idx[dword]
graph[idx].append(toidx)
#print graph
index = 0
components = []
S = []
v_index = {}
v_lowlink = {}
v_onStack = {}
def strongConnect(v):
global index
global components
global S
global v_index
global v_lowlink
global v_onStack
v_index[v] = index
v_lowlink[v] = index
index += 1
S.append(v)
v_onStack[v] = True
# for edges of V
for w in graph[v]:
if w not in v_index:
strongConnect(w)
v_lowlink[v] = min(v_lowlink[v], v_lowlink[w])
elif v_onStack[w]:
v_lowlink[v] = min(v_lowlink[v], v_lowlink[w])
if v_lowlink[v] == v_index[v]:
component = []
while True:
w = S.pop()
v_onStack[w] = False
component.append(w)
if w==v:
break
components.append(component)
def SCC(graph):
global index
global components
global S
global v_index
global v_lowlink
global v_onStack
index = 0
components = []
S = []
v_index = {}
v_lowlink = {}
v_onStack = {}
for v in graph:
if v not in v_index:
strongConnect(v)
return components
comps = SCC(graph)
#print comps
newnodemap = {}
for idx in range(len(comps)):
comp = comps[idx]
for node in comp:
newnodemap[node] = idx
newgraph = {}
for idx in range(len(comps)):
comp = comps[idx]
outgoing = set([])
for node in comp:
nodeout = graph[node]
newnodeout = set([])
for no in nodeout:
newnodeout.add(newnodemap[no])
outgoing = outgoing.union(newnodeout)
outgoing.discard(idx)
newgraph[idx] = list(outgoing)
#print newgraph
# count number of nodes with no incoming edges
ans = 0
for node in newgraph:
if len(newgraph[node])==0:
ans += 1
print ans