1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253 |
- 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
- }
|