代码源每日一题div1_Mouse Hunt _基环树

代码源每日一题div1

Mouse Hunt _基环树

题目大意:

n个点,每一个点都有一个出边。每个点都有一个放陷阱的花费。老鼠会从任意点出发走完该连通块。问不论如何都能抓到老鼠的最小花费是多少。

思路和代码:

比较简单

只要对每一个基环森林都跑一边环,在该环上找最小即可。

void solve(){
	
	cin >> n ;
	vct<int> nxt(n + 1 , 0) ;
	vct<int> tag(n + 1 , 0) ;
	vct<ll> w(n + 1 , 0) ;
	ll ans = 0 ;
	rep(i , 1 , n) cin >> w[i] ;
	rep(i , 1 , n) cin >> nxt[i] ;
	
	rep(i , 1 , n){// 枚举起点
		if(tag[i]) continue ;
		stack<int> dp ;
		int now = i ;
		bool f = 1 ;
		while(tag[now] != i){
			if(tag[now] > 0 && tag[now] != i){
				f = 0 ; break ;
                //
			}
			tag[now] = i ;
			dp.push(now) ;
			now = nxt[now] ;
		}
		if(!f) continue ;
		ll res = INF ;
		if(dp.size())
		while(dp.size()){
			res = min(res , w[dp.top()]) ;
			if(dp.top() == now) break ;
			dp.pop() ;
		}
		ans += res ;
		
	}
	cout << ans << "\n" ;
	
}//code_by_tyrii 

小结:

posted @ 2022-04-27 21:12  tyrii  阅读(40)  评论(0)    收藏  举报