โจทย์
มีกราฟ จุดยอดและ เส้นเชื่อม แต่ละเส้นเชื่อมจะมีน้ำหนัก สำหรับเส้นเชื่อม ที่เชื่อมระหว่าง และ และมีสัมประสิทธ์
ในการเดินทางสามารถใช้เครื่องวาร์ปในการเดินทางได้ ครั้ง โดยเครื่องวาร์ปจะทำให้เราสามารถเดินทางจาก จุดยอด ไปยังจุดยอด ได้โดยเสียค่าใช้จ่าย
ต้องการหาระยะทางที่สั้นที่สุดจากจุดยอด ไปยังจุดยอด
ปัญหาย่อย และ
ในปัญหายาอยนี้สามารถใช้ Dijkstra’s Algorithm ในการหาระยะทางที่สั้นที่สุดจากจุดยอด ไปยังจุดยอดใด ๆ และ หาระยะทางที่สั้นที่สุดจากจุดยอด ไปยังจุดยอดใด ๆ ได้เช่นกัน
กำหมดให้ หมายถึงระยะทางที่สั้นที่สุดจากจุดยอด ไปยังจุดยอด และ
หมายถึงระยะทางที่สั้นที่สุดจากจุดยอด ไปยังจุดยอด
struct state_t {
int v;
long double w;
state_t(int _v, long double _w):
v(_v), w(_w) {}
bool operator < (const state_t &o) const {
return w > o.w;
}
};
vector<pair<int, long double>> adj[N];
long double C[N];
long double squared(long double x) {
return x * x;
}
// simple dijkstra's algorithm
void dijkstra(int s, long double *dist) {
for(int i=0; i<N; ++i) {
dist[i] = INF;
}
std::priority_queue<state_t> pq;
pq.emplace(s, dist[s] = 0);
while(!pq.empty()) {
state_t cur = pq.top();
pq.pop();
if(cur.w > dist[cur.v]) {
continue;
}
for(auto [v, c]: adj[cur.v]) {
long double nxt = cur.w + squared(H[cur.v] - H[v]) * c;
if(dist[v] > nxt) {
pq.emplace(v, dist[v] = nxt);
}
}
}
}
// dijkstra(s, f);
// dijkstra(t, g);
ในการทำงานของ Dijkstra’s Algorith จะใช้เวลาในการทำงาน
ในการหาค่าระยะทางที่สั้นที่สุดจากจุดยอด ไปยังจุดยอด จะมี 2 กรณี
- ไม่ใช้เครื่องวาร์ป จะได้ระยะทางที่สั้นที่สุดเป็น
- ใช้เครื่องวาร์ป จะได้ระยะทางที่สั้นที่สุดเป็น สำหรับจุดยอด ใด ๆ
ดังนั้นสามารถเขียนในรูปของสมการ Dynamic Programming ได้ว่า
long double min_dist = f[t];
for(int x=0; x<N; ++x) {
for(int y=0; y<N; ++y) {
long double cur_dist = f[x] + K * squared(H[x] - H[y]) + g[y];
min_dist = min(min_dist, cur_dist);
}
}
ในการทำงานของสมการ Dynamic Programming จะใช้เวลา
ทำให้เวลาในการทำงานทั้งหมดของปัญหาย่อยนี้จะเป็น
ปัญหาเต็ม
จากปัญหาย่อยก่อนหน้า สังเกตได้ว่าสามารถในสมการ Dynamic Programming สามารทำการ Optimize ได้ด้วยการใช้ Convex Hull Trick หรือ Li Chao’s Tree
โดยพิจารณา จะได้ว่า
ดังนั้นสามารถเขียนเป็นรูปของเส้นตรงได้ว่า
โดยที่
และ
เมื่อ