สมมติว่ามี n เมืองเชื่อมต่อกันด้วย m ถนน ซึ่งเป็นถนน חד-ทิศทาง (ไปได้เพียงทางเดียว) ถนนถูกกำหนดในรูปแบบ {ต้นทาง, ปลายทาง} ในแต่ละเมืองมีราคาข้าวสาลีต่างกัน ตัวแปร price เก็บราคาที่เมืองที่ i นักเดินทางสามารถซื้อข้าวสาลีจากเมืองใดก็ได้ และเดินทางไปขายที่เมืองอื่น (หากเดินทางได้) เป้าหมายคือหากำไรสูงสุดที่เป็นไปได้
ตัวอย่าง: n = 5, m = 3, price = {4, 6, 7, 8, 5}, roads = {{1, 2}, {2, 3}, {2, 4}, {4, 5}} ผลลัพธ์คือ 4 โดยซื้อที่เมือง 1 (ราคา 4) และขายที่เมือง 4 (ราคา 8) กำไร = 4
ขั้นตอนการแก้ปัญหา
- สร้างกราฟ
graphขนาดn×nจากอาร์เรย์roads(ปรับดัชนีเป็น 0-based) - สร้างอาร์เรย์
tpขนาดnเริ่มต้นค่าเป็น-infinity - วนลูป
i = 0 ถึง n-1สำหรับแต่ละจุดuในgraph[i]อัปเดตtp[u] = min(tp[u], tp[i], price[i]) - คำนวณผลลัพธ์
res = max(res, price[i] - tp[i])สำหรับทุกi - คืนค่า
res
ตัวอย่างโค้ด C++
#include <bits/stdc++.h>
using namespace std;
int solve(int n, int m, vector<int> price, vector<pair<int, int>> roads) {
vector<vector<int>> graph(n);
for(int i = 0; i < m; i++) {
int x = roads[i].first;
int y = roads[i].second;
x--; y--;
graph[x].push_back(y);
}
vector<int> tp(n, INT_MAX);
for(int i = 0; i < n; i++) {
for(int u : graph[i]) {
tp[u] = min({tp[u], tp[i], price[i]});
}
}
int res = INT_MIN;
for(int i = 0; i < n; i++) {
res = max(res, price[i] - tp[i]);
}
return res;
}
int main() {
int n = 5, m = 3;
vector<int> price = {4, 6, 7, 8, 5};
vector<pair<int, int>> roads = {{1, 2}, {2, 3}, {2, 4}, {4, 5}};
cout << solve(n, m, price, roads);
return 0;
}
อินพุต / เอาต์พุต
Input: 5, 3, {4, 6, 7, 8, 5}, {{1, 2}, {2, 3}, {2, 4}, {4, 5}}
Output: 4