题解:[ABC376D] Cycle
[ABC376D] Cycle
题意:
有 \(n\) 个点,\(m\) 条边权为 \(1\) 的单向边,问经过 \(1\) 号点的最小环长度。
思路:
从 \(1\) 号点开始 bfs,枚举队首点出边所至点,若未遍历过就更新距离且压入队列,若遍历过且点的编号为 \(1\),说明可以构成一个环,用当前点距 \(1\) 号点距离更新最小环的长度。
因为数据不大,所以不需要优化也能过。
代码:
#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll n, m, ans=0x3f3f3f;
vector <ll> e[200005];
void bfs() {
ll dis[200005];
memset(dis, -1, sizeof(dis));
queue <ll> q;
dis[1]=0;
q.push(1);
while(!q.empty()) {
ll u=q.front();
q.pop();
for(auto v:e[u]) {
if(dis[v]==-1) { //未遍历过,扩展
dis[v]=dis[u]+1;
q.push(v);
} else if(v==1) {
ans=min(ans, dis[u]+1); //一个环,更新答案
}
}
}
}
int main() {
scanf("%lld%lld", &n, &m);
ll u, v;
for(int i=1; i<=m; i++) {
scanf("%lld%lld", &u, &v);
e[u].push_back(v);
}
bfs();
if(ans==0x3f3f3f) printf("-1");
else printf("%lld", ans);
return 0;
}

浙公网安备 33010602011771号