All pastes #25682 Raw Edit

Miscellany

public text v1 · immutable
#25682 ·published 2005-10-16 17:50 UTC
rendered paste body
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()