diff --git a/I.py b/I.py new file mode 100644 index 0000000..c5f24cf --- /dev/null +++ b/I.py @@ -0,0 +1,42 @@ +from __future__ import print_function +import heapq, sys + +def dijkstra(G, s): + V, E = G; d = {}; S = set(); q = [] + for u in V: d.setdefault(u, None) + for u in s: + d[u] = 0; heapq.heappush(q, (0,u)) + while q: + n, u = heapq.heappop(q) + if u in S: continue + S.add(u) + for v in E[u]: + if d[v] is None or d[v] > d[u] + 1: + d[v] = d[u] + 1; heapq.heappush(q, (d[v],v)) + return d + +def transpose(G): + V, E = G; ET = {} + for u in V: ET[u] = [] + for u, vs in E.iteritems(): + for v in vs: ET[v].append(u) + return V, ET + +n, m, k = map(int, sys.stdin.readline().split()) +iron = [ int(x)-1 for x in sys.stdin.readline().split() ] +coal = [ int(x)-1 for x in sys.stdin.readline().split() ] +V, E = range(n), {} +for i, line in enumerate(sys.stdin): + E[i] = [ int(x)-1 for x in line.split()[1:] ] +G = V, E +GT = transpose(G) +ds = dijkstra(G, [0]) +di = dijkstra(GT, iron) +dc = dijkstra(GT, coal) +try: + m = min( ds[i]+di[i]+dc[i] for i in xrange(n) + if None not in (ds[i],di[i],dc[i]) ) + print(m) +except ValueError as e: + if "empty" not in e.args[0]: raise + print("impossible")