#include <cstdio>
#include <vector>
#include <cstring>
#include <queue>
constexpr int MAX_N = 1005;
using namespace std;
int n, m;
vector<int> adj[MAX_N];
bool vis[MAX_N];
int solve(int s) {
memset(vis, 0, sizeof(vis));
queue<int> to_visit;
to_visit.push(s);
int lvl = 0;
while (!to_visit.empty()) {
int sz = to_visit.size();
for (int i = 0; i < sz; ++i) {//这里 正好把上一个变量进队的点全部出掉 然后才增加步长
int u = to_visit.front(); to_visit.pop();
if (u == s && lvl > 0) return lvl;
if (vis[u]) continue;
vis[u] = true;
for (int v : adj[u]) {
to_visit.push(v);
}
}
++lvl;
}
return -1;
}
int main() {
scanf(" %d %d", &n, &m);
for (int i = 1; i <= m; ++i) {
int u, v;
scanf(" %d %d", &u, &v);
adj[u].push_back(v);
}
int best = -1;
for (int u = 1; u <= n; ++u) {
int cur = solve(u);
if (cur != -1) {
if (best == -1 || cur < best) {
best = cur;
}
}
}
printf("%d\n", best);
return 0;
}
bfs 队列只存单变量 控制步长的方法
最新推荐文章于 2022-10-03 11:23:50 发布