2015 Jan Bronze Problem 1 Cow Routing: Difference between revisions
(Created page with "== Problem == == Solution == == Code == Category:Yearly_2014_2015 Category:Bronze") |
No edit summary |
||
(2 intermediate revisions by the same user not shown) | |||
Line 1: | Line 1: | ||
== Official Problem Statement == | |||
[http://www.usaco.org/index.php?page=viewproblem2&cpid=507 Cow Routing] | |||
== Problem == | == Problem == | ||
The problem gives you three integers A, B and N, representing the starting city, the target city, and the number of flight routes respectively. Each flight route has a cost and a list of cities (in order) that the route will pass. You are asked to determine the minimum cost for Bessie the cow to fly from city A to city B. If there is no such route, output -1. | |||
== Solution == | == Solution == | ||
This problem can be solved by using a simple greedy approach. | |||
First, we create an array to store the flight cost from each city to the target city B. We initialize this array to infinity since we haven't processed any flight routes yet. | |||
Then we iterate through all flight routes in the input. For each route, we find the first city that is in the route and its cost to the target city is not infinity. This means that we can fly to the target city from this city. Therefore, we can update the flight cost from all cities before this city to the target city (including this city) in this route. The cost should be the larger one between the cost of this flight route and the cost from this city to the target city. | |||
Finally, we output the flight cost from the starting city A to the target city B. | |||
The time complexity of this algorithm is O(n^2), where n is the number of cities. This is because we need to iterate through all cities in each flight route. However, since the constraints of this problem are low (n <= 500), this solution is fast enough. | |||
== Code == | == Code == | ||
=== C++ === | |||
<pre> | |||
#include <iostream> | |||
#include <climits> // To use INT_MAX instead of INF | |||
using namespace std; | |||
int main() { | |||
freopen("cowroute.in", "r", stdin); | |||
freopen("cowroute.out", "w", stdout); | |||
int A, B, N; // Declare variables for starting city, target city and number of flight routes | |||
cin >> A >> B >> N; | |||
int result = INT_MAX; // Initialize the result with the maximum possible integer value | |||
for (int i = 0; i < N; i++) { // Loop through each flight route | |||
int cost, sz; // Declare variables for the cost of the flight route and the number of cities it passes through | |||
cin >> cost >> sz; | |||
bool found_A = false; // Variable to check if city A is found in the flight route | |||
for (int j = 0; j < sz; j++) { // Loop through each city in the flight route | |||
int city; // Declare a variable for the current city | |||
cin >> city; | |||
if (city == A) { // If the current city is city A | |||
found_A = true; // Set found_A to true | |||
} | |||
// If city A is found and the current city is city B | |||
// Update the result with the minimum cost | |||
if (found_A && city == B) { | |||
result = min(result, cost); | |||
} | |||
} | |||
} | |||
// If no suitable flight route is found, print -1 | |||
// Otherwise, print the minimum cost | |||
if (result == INT_MAX) { | |||
cout << "-1\n"; | |||
} else { | |||
cout << result << '\n'; | |||
} | |||
return 0; | |||
} | |||
</pre> | |||
=== Java === | |||
<pre> | |||
import java.io.*; | |||
import java.util.*; | |||
public class Main { | |||
public static void main(String[] args) throws IOException { | |||
BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); | |||
String[] input = br.readLine().split(" "); | |||
int A = Integer.parseInt(input[0]); // Starting city | |||
int B = Integer.parseInt(input[1]); // Target city | |||
int N = Integer.parseInt(input[2]); // Number of flight routes | |||
int result = Integer.MAX_VALUE; // Initialize the result with the maximum possible integer value | |||
for (int i = 0; i < N; i++) { | |||
input = br.readLine().split(" "); | |||
int cost = Integer.parseInt(input[0]); // Cost of the flight route | |||
int sz = Integer.parseInt(input[1]); // Number of cities it passes through | |||
boolean found_A = false; // Variable to check if city A is found in the flight route | |||
input = br.readLine().split(" "); | |||
for (int j = 0; j < sz; j++) { // Loop through each city in the flight route | |||
int city = Integer.parseInt(input[j]); // Current city | |||
if (city == A) { // If the current city is city A | |||
found_A = true; // Set found_A to true | |||
} | |||
// If city A is found and the current city is city B | |||
// Update the result with the minimum cost | |||
if (found_A && city == B) { | |||
result = Math.min(result, cost); | |||
} | |||
} | |||
} | |||
// If no suitable flight route is found, print -1 | |||
// Otherwise, print the minimum cost | |||
System.out.println(result == Integer.MAX_VALUE ? "-1" : result); | |||
} | |||
} | |||
</pre> | |||
=== Python === | |||
<pre> | |||
import sys | |||
A, B, N = map(int, input().split()) | |||
result = float('inf') # Initialize the result with the maximum possible integer value | |||
for _ in range(N): | |||
cost, sz = map(int, input().split()) | |||
found_A = False # Variable to check if city A is found in the flight route | |||
cities = list(map(int, input().split())) | |||
for city in cities: # Loop through each city in the flight route | |||
if city == A: # If the current city is city A | |||
found_A = True # Set found_A to true | |||
# If city A is found and the current city is city B | |||
# Update the result with the minimum cost | |||
if found_A and city == B: | |||
result = min(result, cost) | |||
# If no suitable flight route is found, print -1 | |||
# Otherwise, print the minimum cost | |||
if result == float('inf'): | |||
print("-1") | |||
else: | |||
print(result) | |||
</pre> | |||
[[Category:Yearly_2014_2015]] | [[Category:Yearly_2014_2015]] | ||
[[Category:Bronze]] | [[Category:Bronze]] | ||
[[Category:Arrays]] | |||
[[Category:Simulation]] | |||
[[Category:Greedy]] |
Latest revision as of 22:45, 11 June 2023
Official Problem Statement[edit]
Problem[edit]
The problem gives you three integers A, B and N, representing the starting city, the target city, and the number of flight routes respectively. Each flight route has a cost and a list of cities (in order) that the route will pass. You are asked to determine the minimum cost for Bessie the cow to fly from city A to city B. If there is no such route, output -1.
Solution[edit]
This problem can be solved by using a simple greedy approach.
First, we create an array to store the flight cost from each city to the target city B. We initialize this array to infinity since we haven't processed any flight routes yet.
Then we iterate through all flight routes in the input. For each route, we find the first city that is in the route and its cost to the target city is not infinity. This means that we can fly to the target city from this city. Therefore, we can update the flight cost from all cities before this city to the target city (including this city) in this route. The cost should be the larger one between the cost of this flight route and the cost from this city to the target city.
Finally, we output the flight cost from the starting city A to the target city B.
The time complexity of this algorithm is O(n^2), where n is the number of cities. This is because we need to iterate through all cities in each flight route. However, since the constraints of this problem are low (n <= 500), this solution is fast enough.
Code[edit]
C++[edit]
#include <iostream> #include <climits> // To use INT_MAX instead of INF using namespace std; int main() { freopen("cowroute.in", "r", stdin); freopen("cowroute.out", "w", stdout); int A, B, N; // Declare variables for starting city, target city and number of flight routes cin >> A >> B >> N; int result = INT_MAX; // Initialize the result with the maximum possible integer value for (int i = 0; i < N; i++) { // Loop through each flight route int cost, sz; // Declare variables for the cost of the flight route and the number of cities it passes through cin >> cost >> sz; bool found_A = false; // Variable to check if city A is found in the flight route for (int j = 0; j < sz; j++) { // Loop through each city in the flight route int city; // Declare a variable for the current city cin >> city; if (city == A) { // If the current city is city A found_A = true; // Set found_A to true } // If city A is found and the current city is city B // Update the result with the minimum cost if (found_A && city == B) { result = min(result, cost); } } } // If no suitable flight route is found, print -1 // Otherwise, print the minimum cost if (result == INT_MAX) { cout << "-1\n"; } else { cout << result << '\n'; } return 0; }
Java[edit]
import java.io.*; import java.util.*; public class Main { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String[] input = br.readLine().split(" "); int A = Integer.parseInt(input[0]); // Starting city int B = Integer.parseInt(input[1]); // Target city int N = Integer.parseInt(input[2]); // Number of flight routes int result = Integer.MAX_VALUE; // Initialize the result with the maximum possible integer value for (int i = 0; i < N; i++) { input = br.readLine().split(" "); int cost = Integer.parseInt(input[0]); // Cost of the flight route int sz = Integer.parseInt(input[1]); // Number of cities it passes through boolean found_A = false; // Variable to check if city A is found in the flight route input = br.readLine().split(" "); for (int j = 0; j < sz; j++) { // Loop through each city in the flight route int city = Integer.parseInt(input[j]); // Current city if (city == A) { // If the current city is city A found_A = true; // Set found_A to true } // If city A is found and the current city is city B // Update the result with the minimum cost if (found_A && city == B) { result = Math.min(result, cost); } } } // If no suitable flight route is found, print -1 // Otherwise, print the minimum cost System.out.println(result == Integer.MAX_VALUE ? "-1" : result); } }
Python[edit]
import sys A, B, N = map(int, input().split()) result = float('inf') # Initialize the result with the maximum possible integer value for _ in range(N): cost, sz = map(int, input().split()) found_A = False # Variable to check if city A is found in the flight route cities = list(map(int, input().split())) for city in cities: # Loop through each city in the flight route if city == A: # If the current city is city A found_A = True # Set found_A to true # If city A is found and the current city is city B # Update the result with the minimum cost if found_A and city == B: result = min(result, cost) # If no suitable flight route is found, print -1 # Otherwise, print the minimum cost if result == float('inf'): print("-1") else: print(result)