package main import ( "fmt" "io" "log" "os" "strconv" "strings" ) var allTowns map[string]roads type roads map[string]int func main() { allTowns = make(map[string]roads) var input []string var readInp, bldInput string for { _, err := fmt.Scan(&readInp) if err != nil { if err != io.EOF { log.Fatal(err) } break } if strings.HasSuffix(bldInput, "=") { bldInput = bldInput + " " + readInp input = append(input, bldInput) bldInput = "" continue } if len(bldInput) > 0 { bldInput += " " } bldInput = bldInput + readInp } for i := range input { dirTowns := strings.Split(input[i], " to ") secondPart := strings.Split(dirTowns[1], " = ") town1 := dirTowns[0] town2 := secondPart[0] distance := mustAtoi(secondPart[1]) buildRoute(town1, town2, distance) } // All routes should be built, find the shortest var shortestRoute []string shortestDistance := -1 for i := range allTowns { var visited []string lastVisit := i tripDistance := 0 for len(visited) < len(allTowns) { var dist int visited = append(visited, lastVisit) lastVisit, dist = findShortest(lastVisit, visited) if dist > 0 { tripDistance += dist } } if shortestDistance == -1 || tripDistance < shortestDistance { shortestDistance = tripDistance shortestRoute = visited } } // Now find the longest var longestRoute []string longestDistance := -1 for i := range allTowns { var visited []string lastVisit := i tripDistance := 0 for len(visited) < len(allTowns) { var dist int visited = append(visited, lastVisit) lastVisit, dist = findLongest(lastVisit, visited) if dist > 0 { tripDistance += dist } } if longestDistance == -1 || tripDistance > longestDistance { longestDistance = tripDistance longestRoute = visited } } fmt.Println("Shortest Route:" + strconv.Itoa(shortestDistance)) fmt.Println(strings.Join(shortestRoute, "->")) fmt.Println("Longest Route:" + strconv.Itoa(longestDistance)) fmt.Println(strings.Join(longestRoute, "->")) } func findShortest(from string, exclude []string) (string, int) { var toTown string shortest := -1 for j := range allTowns[from] { var didIt bool for ex := range exclude { if j == exclude[ex] { didIt = true break } } if didIt { continue } // Find the quickest trip from here if shortest == -1 || allTowns[from][j] < shortest { shortest = allTowns[from][j] toTown = j } } return toTown, shortest } func findLongest(from string, exclude []string) (string, int) { var toTown string longest := -1 for j := range allTowns[from] { var didIt bool for ex := range exclude { if j == exclude[ex] { didIt = true break } } if didIt { continue } // Find the longest trip from here if longest == -1 || allTowns[from][j] > longest { longest = allTowns[from][j] toTown = j } } return toTown, longest } func mustAtoi(i string) int { var ret int var err error if ret, err = strconv.Atoi(i); err != nil { fmt.Println("Tried to mustAtoi: " + i) os.Exit(1) } return ret } func buildRoute(t1, t2 string, dist int) { if _, ok := allTowns[t1]; !ok { // Add this town allTowns[t1] = make(map[string]int) } allTowns[t1][t2] = dist // And the other direction if _, ok := allTowns[t2]; !ok { // Add this town allTowns[t2] = make(map[string]int) } allTowns[t2][t1] = dist }