代码源每日一题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

浙公网安备 33010602011771号