链接
传送门
code
#include <iostream>
#include <queue>
#include <vector>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int N = 2e5 + 10;
int n, m;
int dis[N], vis[N], dp[N];
vector<vector<int>> g(N);
void bfs(){
queue<int> que;
dis[1] = 0;
que.push(1);
while (que.size()){
int u = que.front();
que.pop();
for (int v : g[u]) {
if (dis[v] == -1){
dis[v] = dis[u] + 1;
que.push(v);
}
}
}
}
void dfs(int u){
vis[u] = 1;
dp[u] = dis[u];
for (int v : g[u]) {
if (!vis[v] && dis[u] < dis[v])
dfs(v);
if (dis[v] > dis[u]){
dp[u] = min(dp[u], dp[v]);
}else{
dp[u] = min(dp[u], dis[v]);
}
}
}
void solve(){
for (int i = 0; i <= n; ++i) {
g[i].clear();
}
g.clear();
scanf("%d%d", &n, &m);
for (int i = 0, u, v; i < m; ++i) {
scanf("%d%d", &u, &v);
g[u].push_back(v);
}
memset(dis, -1, sizeof dis);
memset(vis, 0, sizeof vis);
memset(dp, 0, sizeof dp);
bfs();
dfs(1);
for (int i = 1; i <= n; ++i) {
printf("%d ", dp[i]);
}
printf("\n");
}
int main(){
int cases;
scanf("%d", &cases);
while (cases--){
solve();
}
return 0;
}