你從安靜的郊區搬到大城市,上學需結合步行與搭乘地鐵。步行速度 10 km/h,地鐵速度 40 km/h。假設到達車站即有班車可搭乘,可任意換乘路線。給定家與學校的坐標,以及多條地鐵路線的站點座標(每條路線至少兩站,站點間直線行駛),求從家到學校的最短時間(分鐘,四捨五入)。
-1 -1 結束。總站點數 ≤ 200。struct Point { double x, y; };
const int MAXN = 400;
double dist[MAXN]; // 到起點的最短距離
bool vis[MAXN]; // 是否已確定最短路徑
double graph[MAXN][MAXN]; // 鄰接矩陣存儲時間權重
Point stops[MAXN]; // 所有節點座標
void Dijkstra(int src, int n) {
fill(dist, dist + n, 1e100);
fill(vis, vis + n, false);
dist[src] = 0;
for (int i = 0; i < n; ++i) {
int u = -1;
double best = 1e100;
for (int j = 0; j < n; ++j)
if (!vis[j] && dist[j] < best) best = dist[u = j];
if (u == -1) break;
vis[u] = true;
for (int v = 0; v < n; ++v)
if (!vis[v] && graph[u][v] < 1e100)
dist[v] = min(dist[v], dist[u] + graph[u][v]);
}
}
節點數 N ≤ 202,Dijkstra 用鄰接矩陣實現為 O(N²),完全足夠。
startsWith / endsWith 實作與邊界處理
C/C++ 函式參數傳遞機制深度解析:值傳遞、指標傳遞、參考傳遞與移動語義
Linux 共享庫開發完整指南:建立 .so 與動態載入 (dlopen/dlsym)