399.evaluate-division.go 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. type pair struct {
  2. key string
  3. ratio float64
  4. }
  5. func calcEquation(equations [][]string, values []float64, queries [][]string) []float64 {
  6. m, n := len(values), len(queries)
  7. route := make(map[string][]pair)
  8. for i := 0; i < m; i++ {
  9. a, b := equations[i][0], equations[i][1]
  10. if a == b {
  11. if _, ok := route[a]; !ok {
  12. route[a] = make([]pair, 0)
  13. }
  14. continue
  15. }
  16. route[a] = append(route[a], pair{b, values[i]})
  17. route[b] = append(route[b], pair{a, 1.0 / values[i]})
  18. }
  19. ans := make([]float64, n)
  20. for i := 0; i < n; i++ {
  21. visited := make(map[string]bool)
  22. if ratio := dfs(route, queries[i][0], queries[i][1], &visited); ratio == 0.0 {
  23. ans[i] = -1.0
  24. } else {
  25. ans[i] = ratio
  26. }
  27. }
  28. return ans
  29. }
  30. func dfs(route map[string][]pair, a, b string, visited *map[string]bool) float64 {
  31. if a == b {
  32. if _, ok := route[a]; ok {
  33. return 1.0
  34. } else {
  35. return 0.0
  36. }
  37. }
  38. (*visited)[a] = true
  39. adj := route[a]
  40. for i := range adj {
  41. if (*visited)[adj[i].key] {
  42. continue
  43. }
  44. ratio := adj[i].ratio * dfs(route, adj[i].key, b, visited)
  45. if ratio != 0.0 {
  46. return ratio
  47. }
  48. }
  49. return 0.0
  50. }