zoukankan      html  css  js  c++  java
  • Mouse Hunt

    Mouse Hunt

    给定一个n个点的图,每个点有权值(c_i),并且只有一条出边。现在你要在一些点上打标记,使得从任何一个点出发最终都会经过有标记的点。求标记点的权值和最小值。

    就是找环啊!拓扑排序啊!

    #include <cstdio> 
    #include <algorithm>
    using namespace std;
    
    const int maxn=2e5+5;
    int n, c[maxn], a[maxn], in[maxn], vis[maxn];
    int q[maxn], h, t, ans;
    
    int dfs(int now){
    	vis[now]=1;
    	if (vis[a[now]]) return c[now];
    	return min(c[now], dfs(a[now]));
    }
    
    int main(){
    	scanf("%d", &n); int now;
    	for (int i=1; i<=n; ++i) scanf("%d", &c[i]);
    	for (int i=1; i<=n; ++i){ scanf("%d", &a[i]); ++in[a[i]]; }
    	for (int i=1; i<=n; ++i) if (!in[i]) q[t++]=i;
    	while (h<t){
    		now=q[h++]; --in[a[now]];
    		if (!in[a[now]]) q[t++]=a[now];
    	}
    	for (int i=1; i<=n; ++i) if (in[i]&&!vis[i]) ans+=dfs(i);
    	printf("%d
    ", ans);
    	return 0;
    }
    
  • 相关阅读:
    es6 Set 和Map 数据结构
    es6 Symbol
    es6 对象的扩展
    es6 class
    es6 数组扩展方法
    Docker入门01——Image
    GORM 中文文档
    将以前的文章开始慢慢转到这里发表
    环境变量
    在 Linux 中安装 VMware Tools
  • 原文地址:https://www.cnblogs.com/MyNameIsPc/p/9502568.html
Copyright © 2011-2022 走看看