Loading

题解:[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;
}
posted @ 2024-10-20 09:16  Anins  阅读(38)  评论(0)    收藏  举报  来源