J题 | 终于再见
解题思路:
由于繁华度最多大概有 种,因此我们可以从大到小对每种繁华度的点都执行一次多源BFS,更新最短路即可。
示例代码:
vector<int>adj[N]; // 邻接表存图
void solve() {
int n, m, INF = LLONG_MAX;
cin >> n >> m;
for (int i = 0, u, v; i < m; ++i) {
cin >> u >> v;
adj[u].push_back(v);
adj[v].push_back(u);
}
set<int> degs; // set排序并去重繁华度
for (int i = 1; i <= n; ++i) degs.insert(adj[i].size());
auto deg = --degs.end();
vector<int> ans(n + 1, INF);
queue<pii> q;
while (deg != degs.begin()) {
vector<int> vis(n + 1, 0);
for (int i = 1; i <= n; ++i)
if (adj[i].size() == *deg)
q.push({i, 0}), vis[i] = 1; // 多源
--deg;
while (!q.empty()) {
pii p = q.front();
q.pop();
int u = p.x, dis = p.y + 1;
for (auto v : adj[u]) {
if (vis[v])continue;
vis[v] = 1;
if (adj[v].size() <= *deg)
ans[v] = min(ans[v], dis);
q.push({v, dis});
}
}
}
for (int i = 1; i <= n; ++i)
cout << (ans[i] == INF ? -1 : ans[i]) << ' ';
}

京公网安备 11010502036488号