Codeforces - Mouse Hunt

题目链接: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;
}
发布了725 篇原创文章 · 获赞 244 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/weixin_43826249/article/details/104857159