火車路網本質是一個有向加權圖:
適合稀疏圖(車站多、直達區間少),空間效率高。
// 邊節點:代表一個直達區間
struct EdgeNode {
int destStationId; // 終點站 ID
int distance; // 里程 (權重)
int trainId; // 列車班次
EdgeNode* next; // 同起點的下一條邊
};
// 頂點節點:代表一個車站
struct VertexNode {
int stationId;
char stationName[32];
EdgeNode* firstEdge; // 指向第一條出發邊
};
// 圖結構:車站陣列
struct Graph {
VertexNode stations[MAX_STATIONS];
int stationCount;
};
int calculateTotalDistance(Graph* g, int path[], int pathLen) {
int total = 0;
for (int i = 0; i < pathLen - 1; i++) {
int u = path[i];
int v = path[i+1];
// 遍歷 u 的鄰接表找到指向 v 的邊
EdgeNode* e = g->stations[u].firstEdge;
while (e && e->destStationId != v) e = e->next;
if (!e) return -1; // 路徑不存在
total += e->distance;
}
return total;
}
若需求是「自動推薦最短里程路線」,需實作 Dijkstra:
// 優先隊列節點
struct PQNode {
int stationId;
int dist; // 從起點累積里程
bool operator<(const PQNode& other) const { return dist > other.dist; } // 小根堆
};
vector dijkstra(Graph* g, int src, int dest) {
vector dist(g->stationCount, INT_MAX);
vector prev(g->stationCount, -1);
priority_queue pq;
dist[src] = 0;
pq.push({src, 0});
while (!pq.empty()) {
int u = pq.top().stationId; pq.pop();
if (u == dest) break;
for (EdgeNode* e = g->stations[u].firstEdge; e; e = e->next) {
int v = e->destStationId;
int alt = dist[u] + e->distance;
if (alt < dist[v]) {
dist[v] = alt;
prev[v] = u;
pq.push({v, alt});
}
}
}
// 重構路徑
vector path;
for (int cur = dest; cur != -1; cur = prev[cur]) path.push_back(cur);
reverse(path.begin(), path.end());
return path; // 空向量表示不可達
}
時間、票價、列車類型,支援多條件最優路徑查詢。