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
}