// 若不存在負環,則做 n - 1 次後 dist 會儲存 0 到每個點的最短路徑 for (int i = 0; i < n - 1; ++i) for (int u = 1; u <= n; ++u) { for (auto& [v, w] : edges[u]) if (dist[u] != INT_MAX) dist[v] = min(dist[u] + w, dist[v]); }
for (int u = 1; u <= n; ++u) for (auto& [v, w] : edges[u]) { // 如果 v 還能變小,表示 v 可以無限變小 if (dist[u] != INT_MAX && dist[v] > dist[u] + w) { dist[v] = dist[u] + w; s.insert(v); } } }
intmain() { int n, Case = 0; while (cin >> n) { init();
for (int i = 1; i <= n; ++i) { int b; cin >> b; busyness[i] = b; }
int m; cin >> m;
while (m--) { int u, v; cin >> u >> v; edges[u].push_back({ v, (int)pow(busyness[v] - busyness[u], 3) }); }