ในมหาวิทยาลัยศิลปากร มีสถานที่สำคัญทั้งหมด จุด และมีรถขนส่งไฟฟ้าทั้งหมด คัน โดยรถขนส่งไฟฟ้าแต่ละคัน จะรับ-ส่งผู้โดยสารระหว่างสถานที่สำคัญ 2 จุดเท่านั้น และ รถหมายเลข จะมีค่าใช้จ่ายเฉพาะคันคือ สำหรับทุกๆ
นายสมหวังผู้ได้รับมอบหมายให้จัดรถขนส่งไฟฟ้า ได้พบว่า หากเราทราบว่ารถคันไหนวิ่งระหว่างจุดไหน เราสามารถคำนวณ “การจัดสรรแบบประหยัด” ได้ ซึ่งการจัดสรรแบบประหยัดนั้น คือ การเลือกรถ คันจากเส้นทางที่กำหนดให้ เพื่อให้ค่าใช้จ่ายรวมของรถที่เลือกมีค่าน้อยที่สุด และผู้ใช้บริการจะต้องสามารถเดินทางไป-มาระหว่างจุดทั้ง จุดได้
เขียนโค้ดที่จะหาวิธีการจัดรถขนส่งไฟฟ้า ที่จะทำให้ “การจัดสรรแบบประหยัด” มีค่ามากที่สุด
“การจัดสรรแบบประหยัด” มันก็คือการหา Minimum Spanning Tree นั่นแหละ
เนื่องจาก MST นั้น จะพยายามเลือก edge ที่มี weight น้อยๆ เราก็จะต้องบังคับให้เขาเลือก edge ที่มี weight มากๆ โดยที่เราจะพยายามทำให้กราฟส่วนที่มี weight น้อยๆให้มี edge เยอะๆ และจะพยายามทำให้กราฟส่วนที่มี weight มากๆให้มี edge น้อยๆ
ภาพที่ 1 ตัวอย่างกราฟดังที่กล่าวมาๆ
ทีนี้ เราก็แค่เขียนโค้ดที่จะทำตามนั้น ซึ่งเราก็แค่เขียนโดยใช้วิธีต่อไปนี้:
เมื่อเสร็จแล้ว ก็ return ได้เลย
#include <bits/stdc++.h>
using namespace std;
vector <pair <int, int>> route(int n, vector <int> w) {
int m = w.size();
vector <pair <int, int>> ans;
bool cant = false;
int curr = 1;
if (m == n && n >= 3) ans.emplace_back(1, 3);
if (m > n) {
for (int i = 2; i <= n; i++) {
ans.emplace_back(i, i - 1); m--;
for (int j = i - 2; j > 0; j--) {
if (m == n - i) {
cant = true;
break;
}
m--;
ans.emplace_back(i, j);
}
if (cant) {
curr = i;
break;
}
}
}
for (auto &[x, y] : ans) if (x > y) swap(x, y);
for (int i = curr; i < n; i++) ans.emplace_back(i, i + 1);
return ans;
}
หากมีข้อสงสัย comment ไว้ใต้ post ได้เลยนะครับ 🙇♂️🙇♂️
ศึกษาโจทย์เพิ่มเติมได้ที่ Fast X Fourier