from sys import stdin from math import log10, pow Inf = float(1e3000) class Node: forgjenger = -1 estimat = Inf kjent = False nummer = 0 naboer = None def __init__(self, node): self.nummer = node def main(): n = int(stdin.readline()) sannsynligheter = [float(x) for x in stdin.readline().split()] nodeliste = [None] * n ko = [None] * n nodenr = 0 for linje in stdin: nodeliste[nodenr] = Node(nodenr) nodeliste[nodenr].naboer = [int(nabo) for nabo in linje.split()] ko[nodenr] = nodeliste[nodenr] nodenr += 1 if (sannsynligheter[0] == 0) or (sannsynligheter[n-1] == 0): print "%.3f" % (0 + 1E-12) else: antKjenteNoder = 0 nodeliste[0].estimat = -log10(sannsynligheter[0]) antIt = int(n/2)+2 #trenger bare sjekke halve grafen paa grunn av uretta (+2 for aa forsikre at int(n/2) + 1 #iterasjoner blir foretatt dersom d er et odde antall noder ;P while (antKjenteNoder < antIt): #prioritets que minste = Inf behandlernode = None teller = 0 koindeks = 0 for node in ko: if node.estimat < minste: koindeks = teller behandlernode = node minste = node.estimat teller += 1 #dersom den minste tilgjenglige noden ikke har estimat if behandlernode == None: break ko.pop(koindeks) behandlernode.kjent = True antKjenteNoder += 1 #behandlernode er naa naermest for nabo in behandlernode.naboer: if not nodeliste[nabo].kjent: if not (sannsynligheter[nabo] == 0): #print nodeliste[behandlernode.nummer].estimat nyttEstimat = nodeliste[behandlernode.nummer].estimat - log10(sannsynligheter[nabo]) if nodeliste[nabo].estimat > nyttEstimat: #oppdater nodeliste[nabo].estimat = nyttEstimat nodeliste[nabo].forgjenger = behandlernode.nummer #beregn sannsynlighet noden = nodeliste[n-1] #sluttnoden sannsynlighet = pow(10,-noden.estimat) print "%.3f" % (sannsynlighet + 1E-12) main()