|
@@ -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
|
|
|
}
|
|
|
+
|