DMY DAY5'
T1
糖丸了,建个分层图第二层连边权为 \(0\) 的边,跑 01bfs 即可,时间复杂度 \(\mathcal{O}(n + m + V \log V)\)。
点击查看代码
#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 10, M = 20;
typedef long long ll;
typedef pair<int, int> pii;
int n, m, a[N], mx, dis[(N << 1) + (1 << M)];
vector<pii>e[(N << 1) + (1 << M)];
void bfs() {memset(dis, 0x3f, sizeof dis);deque<int>q;dis[1] = 0;q.push_back(1);while (!q.empty()) {int u = q.front(); q.pop_front();for (auto [v, l] : e[u]) {if (dis[v] > dis[u] + l) {dis[v] = dis[u] + l;if (l) q.push_back(v);else q.push_front(v);}}}for (int i = 1; i <= n; i++) printf("%d\n", dis[i] == 0x3f3f3f3f ? -1 : dis[i]);
}
int main() {// freopen("ex_walk2.in", "r", stdin);scanf("%d%d", &n, &m);for (int i = 1; i <= n; i++) {scanf("%d", &a[i]);mx = max(mx, a[i]);e[i].push_back({n + a[i] + 1, 1});e[n + a[i] + 1].push_back({i, 0});}for (int i = 1; i <= m; i++) {int u, v;scanf("%d%d", &u, &v);e[u].push_back({v, 1});}for (int i = 0; i <= mx; i++) {for (int j = 0; j < M; j++) {if ((i & (1 << j))) {e[n + i + 1].push_back({n + (i ^ (1 << j)) + 1, 0});}}}bfs();return 0;
}## T2