structedge { int to; int nextEdge; int w; } e[100010]; int cnt = 0; int head[100010]; voidDijkstra(int n, int o)// o作为源点 { bool S[n + 1]; int dis[n + 1]; int pre[n + 1]; // 存放路径(最短路径下某个节点的前一个节点)
for (int i = 0; i <= n; i++) { dis[i] = MAX; S[i] = false; } dis[o] = 0;
while (true) { int min = MAX; int v = 0; // 不存在的节点,方便检查是否连通
for (int j = 1; j <= n; j++) { if ((!S[j]) && (dis[j] < min)) { min = dis[j]; v = j; } } if (v == 0) { break; // 无法抵达剩余节点或无剩余节点 }
S[v] = true;
// 以v作为中间节点更新dis for (int j = head[v]; j; j = e[j].nextEdge) { int wei_v_to_ = e[j].w; if (dis[v] + wei_v_to_ < dis[e[j].to]) { dis[e[j].to] = dis[v] + wei_v_to_; pre[e[j].to] = v; } } } // 假设终点为n if (dis[n] == dis[0]) { return; // 无法抵达终点 } //获取路径 vector<int> path; int pass = n; while (pass != o) { path.push_back(pass); pass = pre[pass]; } path.push_back(o); for (int i = path.size() - 1; i >= 0; i--) { cout << path[i]; } }
structedge { int from; int to; int w; } e[500010]; int cnt = 0; longlong dis[100010]; intBellmanFord(int n, int s) { for (int i = 0; i <= n; i++) { dis[i] = MAX; } dis[s] = 0; for (int i = 0; i < n; i++) { for (int j = 1; j <= cnt; j++) { int u = e[j].from; int v = e[j].to; int w = e[j].w; if (dis[u] + w < dis[v]) { dis[v] = dis[u] + w; if (i == n - 1) { return-1; } } } } return0; }
intBellmanFord(int n, int s, int k) { for (int i = 0; i <= n; i++) { dis[i] = MAX; } dis[s] = 0; for (int i = 0; i < k; i++) { //将上一次循环中dist数组的结果存入backup数组 memcpy(backup, dist, sizeof dist); for (int j = 1; j <= cnt; j++) { int u = e[j].from; int v = e[j].to; int w = e[j].w; if (backup[u] + w < dis[v]) { dis[v] = backup[u] + w; if (i == n - 1) { return-1; } } } } return0; }
voidShortedPath(int n, int s) { vector<int> toPu = ToPu(n);
for (int i = 0; i <= n; i++) { dis[i] = MAX; } dis[s] = 0;
for (int i = 0; i < toPu.size(); i++) { for (int j = head[toPu[i]]; j; j = e[j].NextE) { int u = toPu[i]; int v = e[j].to; int w = e[j].w; if (dis[v] > dis[u] + w) { dis[v] = dis[u] + w; } } } }
for (int i = 1; i <= n; i++) // 重设权值 { int u = i; for (int j = head[u]; j; j = e[j].nextE) { int v = e[j].to; int w = e[j].w; e[j].w = w + dis[u] - dis[v]; } }
vector<int> ans[n]; for (int i = 1; i <= n; i++) { vector<int> Dijkstra_dis = Dijkstra(n, i); for (int j = 1; j <= n; j++) { if (Dijkstra_dis[j] == MAX) { continue; } ans[i][j] = Dijkstra_dis[j] + dis[j] - dis[i]; // 恢复权值 } } }