码迷,mamicode.com
首页 > 其他好文 > 详细

CF1027D Mouse Hunt

时间:2020-06-05 21:19:21      阅读:63      评论:0      收藏:0      [点我收藏+]

标签:seve   bool   ons   use   return   ORC   display   --   names   

题目链接

luogu链接

这道题的简略题意是:

有一个\(n\)个点,\(n\)条边的有向图(可能有自环和重边),叫我们以最小代价选取一些点,使得无论从哪个点出发都要经过这些点。

思路:

因为有n个点,n条边,所以说我们可以知道一定至少有一个环。

而对于一条链来说,这条链必然要通向一个环!

所以我们就可以先进行topo排序,将所有的链删去,然后进行dfs来寻找环内的最大值!

\[Talk \;is\;cheap,\;show\;the\;code\;! \]

#include<cstdio>
#include<iostream>
#define ri register int
#define Starseven main
using namespace std;
const int N=2e5+20;
int n,m,cost[N],ans=0,k,to[N],du[N];
bool vis[N];

void Topo(int x){
	vis[x]=true;
	du[to[x]]--;
	if(!du[to[x]]) Topo(to[x]);
}

int Dfs(int x){
	vis[x]=true;
	if(!vis[to[x]]) return min(Dfs(to[x]),cost[x]);
	else return cost[x];
}

int Starseven(void){
	cin>>n;
	for(ri i=1;i<=n;i++) cin>>cost[i];
	for(ri i=1;i<=n;i++){
		int x;cin>>x;
		to[i]=x,du[x]++;
	}
	for(ri i=1;i<=n;i++) if(!du[i]&&!vis[i]) Topo(i);
	for(ri i=1;i<=n;i++) if(!vis[i]) ans+=Dfs(i);
	cout<<ans<<endl;
	return 0;
}

CF1027D Mouse Hunt

标签:seve   bool   ons   use   return   ORC   display   --   names   

原文地址:https://www.cnblogs.com/starseven/p/13052121.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!