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]) << ' ';
}