|  | @@ -1,3 +1,53 @@
 | 
	
		
			
				|  |  | +type pair struct {
 | 
	
		
			
				|  |  | +	key   string
 | 
	
		
			
				|  |  | +	ratio float64
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  func calcEquation(equations [][]string, values []float64, queries [][]string) []float64 {
 | 
	
		
			
				|  |  | -	
 | 
	
		
			
				|  |  | +	m, n := len(values), len(queries)
 | 
	
		
			
				|  |  | +	route := make(map[string][]pair)
 | 
	
		
			
				|  |  | +	for i := 0; i < m; i++ {
 | 
	
		
			
				|  |  | +		a, b := equations[i][0], equations[i][1]
 | 
	
		
			
				|  |  | +		if a == b {
 | 
	
		
			
				|  |  | +			if _, ok := route[a]; !ok {
 | 
	
		
			
				|  |  | +				route[a] = make([]pair, 0)
 | 
	
		
			
				|  |  | +			}
 | 
	
		
			
				|  |  | +			continue
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +		route[a] = append(route[a], pair{b, values[i]})
 | 
	
		
			
				|  |  | +		route[b] = append(route[b], pair{a, 1.0 / values[i]})
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +	ans := make([]float64, n)
 | 
	
		
			
				|  |  | +	for i := 0; i < n; i++ {
 | 
	
		
			
				|  |  | +		visited := make(map[string]bool)
 | 
	
		
			
				|  |  | +		if ratio := dfs(route, queries[i][0], queries[i][1], &visited); ratio == 0.0 {
 | 
	
		
			
				|  |  | +			ans[i] = -1.0
 | 
	
		
			
				|  |  | +		} else {
 | 
	
		
			
				|  |  | +			ans[i] = ratio
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +	return ans
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +func dfs(route map[string][]pair, a, b string, visited *map[string]bool) float64 {
 | 
	
		
			
				|  |  | +	if a == b {
 | 
	
		
			
				|  |  | +		if _, ok := route[a]; ok {
 | 
	
		
			
				|  |  | +			return 1.0
 | 
	
		
			
				|  |  | +		} else {
 | 
	
		
			
				|  |  | +			return 0.0
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +	(*visited)[a] = true
 | 
	
		
			
				|  |  | +	adj := route[a]
 | 
	
		
			
				|  |  | +	for i := range adj {
 | 
	
		
			
				|  |  | +		if (*visited)[adj[i].key] {
 | 
	
		
			
				|  |  | +			continue
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +		ratio := adj[i].ratio * dfs(route, adj[i].key, b, visited)
 | 
	
		
			
				|  |  | +		if ratio != 0.0 {
 | 
	
		
			
				|  |  | +			return ratio
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +	return 0.0
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  | +
 |