概述
题目链接:Codeforces - Mouse Hunt
因为每个点的出度都为1,所以是一个基环内向树,所以每个联通块都是以环结尾。
所以找到每个联通块的结尾环的最小值相加即可。
AC代码:
#pragma GCC optimize("-Ofast","-funroll-all-loops")
#include<bits/stdc++.h>
//#define int long long
using namespace std;
const int N=2e5+10;
int n,c[N],deg[N],res;
vector<int> g[N];
inline int calc(int x){
deg[x]--; queue<int> q; q.push(x); int res=c[x];
while(q.size()){
int u=q.front(); q.pop(); res=min(res,c[u]);
for(auto to:g[u]) if(--deg[to]==0) q.push(to);
}
return res;
}
signed main(){
cin>>n;
for(int i=1;i<=n;i++) scanf("%lld",&c[i]);
for(int i=1,x;i<=n;i++) scanf("%lld",&x),g[i].push_back(x),deg[x]++;
queue<int> q; for(int i=1;i<=n;i++) if(!deg[i]) q.push(i);
while(q.size()){
int u=q.front(); q.pop();
for(auto to:g[u]) if(--deg[to]==0) q.push(to);
}
for(int i=1;i<=n;i++) if(deg[i]) res+=calc(i);
cout<<res;
return 0;
}
最后
以上就是优美爆米花为你收集整理的Codeforces - Mouse Hunt的全部内容,希望文章能够帮你解决Codeforces - Mouse Hunt所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复