while (!q.empty()) { auto [x, y] = q.front(); q.pop(); for (int i = 0; i < 4; i++) { int a = x + dx[i], b = y + dy[i]; if (a >= 0 && a < n && b >= 0 && b < m && g[a][b] == 0 && dist[a][b] == -1) { dist[a][b] = dist[x][y] + 1; q.push({a, b}); } } }
邻接表
1 2 3 4 5
int h[N], e[M], ne[M], w[M], idx;
voidadd(int a, int b, int c = 1){ e[idx] = b, w[idx] = c, ne[idx] = h[a], h[a] = idx++; }
while (!heap.empty()) { auto [d, ver] = heap.top(); heap.pop(); if (st[ver]) continue; st[ver] = true; for (int i = h[ver]; i != -1; i = ne[i]) { int j = e[i]; if (dist[j] > d + w[i]) { dist[j] = d + w[i]; heap.push({dist[j], j}); } } }
Bellman-Ford / SPFA
1 2 3 4 5 6 7
for (int i = 0; i < k; i++) { memcpy(backup, dist, sizeof dist); for (int j = 0; j < m; j++) { auto [a, b, c] = edges[j]; dist[b] = min(dist[b], backup[a] + c); } }
Floyd
1 2 3 4
for (int k = 1; k <= n; k++) for (int i = 1; i <= n; i++) for (int j = 1; j <= n; j++) d[i][j] = min(d[i][j], d[i][k] + d[k][j]);
Kruskal / 染色法 / 匈牙利
1 2 3 4 5 6 7 8
sort(edges.begin(), edges.end()); for (auto [w, a, b] : edges) { a = find(a), b = find(b); if (a != b) { p[a] = b; res += w; } }