Program to find out the minimum number of intercountry travels in a road trip in Python

In road trip planning, we often need to find the shortest path between cities while minimizing intercountry travels. This problem combines graph traversal with country border crossing penalties to find both the minimum border crossings and total cost.

Problem Understanding

We have a list of roads R where each element is (x, y, cost) representing a road from city x to city y with given cost. We also have a list C where each element contains cities belonging to the same country. Given a starting city s and destination city e, we need to find the minimum intercountry travels and total cost.

Example

For R = [[0, 1, 2], [1, 2, 2], [0, 2, 3], [1, 3, 3]], C = [[0], [1], [2, 3]], s = 0, e = 3, the optimal path is 0?1?3 with 2 intercountry travels and total cost 5.

Algorithm Approach

We use a modified Dijkstra's algorithm where intercountry roads get a large penalty (1010) added to their weight. This ensures we minimize border crossings first, then optimize for cost.

Implementation

from collections import defaultdict
from heapq import heappush, heappop

def solve(R, C, s, e):
    # Map each city to its country index
    cont = defaultdict(int)
    for idx, item in enumerate(C):
        for k in item:
            cont[k] = idx

    # Build adjacency list with intercountry penalty
    adj_list = defaultdict(list)
    for a, b, wt in R:
        if cont[a] != cont[b]:
            wt += 10 ** 10  # Add penalty for intercountry travel
        adj_list[a].append((b, wt))

    # Dijkstra's algorithm
    distance = defaultdict(lambda: 10 ** 20)
    distance[s] = 0
    visited = set()

    heap = [(0, s)]
    while heap:
        d, c = heappop(heap)
        if c in visited:
            continue
        visited.add(c)
        
        for j, wt in adj_list[c]:
            if distance[j] > d + wt:
                distance[j] = d + wt
                heappush(heap, (d + wt, j))

    # Extract intercountry travels and actual cost
    return distance[e] // 10 ** 10, distance[e] % 10 ** 10

# Test with the example
roads = [[0, 1, 2], [1, 2, 2], [0, 2, 3], [1, 3, 3]]
countries = [[0], [1], [2, 3]]
start = 0
end = 3

result = solve(roads, countries, start, end)
print(f"Intercountry travels: {result[0]}, Total cost: {result[1]}")
Intercountry travels: 2, Total cost: 5

How It Works

The algorithm works in three main steps:

  1. Country Mapping: Create a mapping from each city to its country index
  2. Graph Modification: Add a large penalty (1010) to roads that cross country borders
  3. Shortest Path: Use Dijkstra's algorithm to find the path with minimum weighted cost

The penalty ensures that intercountry travels are minimized first. The final result extracts the number of border crossings (integer division) and actual travel cost (modulo operation).

Path Analysis

In our example, the path 0?1?3 involves:

  • City 0 (Country 0) ? City 1 (Country 1): 1st intercountry travel, cost 2
  • City 1 (Country 1) ? City 3 (Country 2): 2nd intercountry travel, cost 3
  • Total: 2 intercountry travels, cost 5

Conclusion

This solution efficiently finds the optimal road trip route by using weighted graph algorithms with border crossing penalties. The approach minimizes intercountry travels first, then optimizes for the lowest travel cost.

Updated on: 2026-03-26T16:53:17+05:30

386 Views

Kickstart Your Career

Get certified by completing the course

Get Started
Advertisements