Codeforces 1027D Mouse Hunt (强连通缩点 || DFS+并查集)
<题目链接>
题目大意:
有n个房间,每个房间都会有一只老鼠。处于第i个房间的老鼠可以逃窜到第ai个房间中。现在要清理掉所有的老鼠,而在第i个房间中防止老鼠夹的花费是ci,问你消灭掉所有老鼠的最少花费。
解题分析:
首先就是要注意老鼠的逃生路线为强连通分量的情况,毫无疑问,这种情况就是在那个强连通分量中的代价最小的房间安装老鼠夹(因为根据老鼠的流通性,只需要在连通分量中安装一个老鼠夹就能捕获所有的老鼠),所以我们先用Tarjan对这些房间进行缩点。然后我们只需要将那些出度为0的强连通分量的代价相加就行(强连通分量的代价=其中任意点的最小代价),因为出度为0的强连通分量一定要消除本身的老鼠,并且根据老鼠的流通性,其它出度不为0的老鼠一定也会到达这些出度为0的连通分量中。
#include <bits/stdc++.h>
using namespace std;
const int INF =0x3f3f3f3f;
#define N int(2e5+7)
#define rep(i,s,t) for(int i=s;i<=t;i++)
#define srep(i,s,t) for(int i=s;i<t;i++)
#define clr(a,b) memset(a,b,sizeof(a))
int n,top,ans,tot,scc;
int outdeg[N],to[N],stk[N],instk[N],bel[N],dfn[N],low[N],cost[N],val[N];
template<typename T> //读入优化
inline T read(T&x){
x=;;char ch=getchar();
') f|=(ch=='-'),ch=getchar();
+ch-',ch=getchar();
return x=f?-x:x;
}
void Tarjan(int u){
dfn[u]=low[u]=++tot;
stk[++top]=u;instk[u]=;
int v=to[u];
if(!dfn[v]){
Tarjan(v);
low[u]=min(low[u],low[v]);
}else if(instk[v])low[u]=min(low[u],dfn[v]);
if(dfn[u]==low[u]){
++scc;
while(true){
int v=stk[top--];
bel[v]=scc;
if(u==v)break;
}
}
}
int main(){
read(n);
rep(i,,n)read(val[i]);
rep(u,,n){
int v;read(v);to[u]=v;
}
rep(i,,n) if(!dfn[i]){ //Tarjan缩点
Tarjan(i);
}
rep(i,,scc)cost[i]=INF;
rep(i,,n)cost[bel[i]]=min(cost[bel[i]],val[i]); //cost[i]为每个强连通分量中花费最少的点
rep(u,,n){
int v=to[u];
if(bel[u]!=bel[v])outdeg[bel[u]]++; //标记每个强连通分量的出度
}
rep(i,,scc)if(!outdeg[i])ans+=cost[i]; //出度为0的点一定要安装(因为至少要消灭这些点本来的老鼠),并且只用安装出度为0的点,因为老鼠具有传递性,最终所有老鼠一定会经过这些出度为0的点
printf("%d\n",ans);
}
另一种做法,用并查集判环,DFS找环上的最小代价:
#include<bits/stdc++.h>
using namespace std;
;
int to[N], val[N], pre[N], x[N];
int find(int x){
return x==pre[x]?x:pre[x]=find(pre[x]);
}
int dfs(int x, int root){
if(x==root) return val[x]; //如果是自环,直接返回本身
return min(dfs(to[x], root), val[x]); //寻找环上权值最小的点
}
int main(){
int n;scanf("%d", &n);
;i<=n;i++)scanf("%d", &val[i]), pre[i] = i;
;i<=n;i++)scanf("%d", &to[i]);
;i<=n;i++){ //并查集判独立的连通块(判环或者判独立的点)
; //如果这个点存在环
else pre[find(to[i])] = find(i);
}
;
;i<=n;i++) if(x[i])ans+=dfs(to[i],i);
printf("%d\n",ans);
}
2019-02-18
Codeforces 1027D Mouse Hunt (强连通缩点 || DFS+并查集)的更多相关文章
- Codeforces B. Mouse Hunt(强连通分解缩点)
题目描述: Mouse Hunt time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...
- CodeForces - 455C Civilization (dfs+并查集)
http://codeforces.com/problemset/problem/455/C 题意 n个结点的森林,初始有m条边,现在有两种操作,1.查询x所在联通块的最长路径并输出:2.将结点x和y ...
- 51nod 1456【强连通,缩点,并查集】
话说这道题的机遇是看到了http://blog.csdn.net/u010885899/article/details/50611895很有意思:然后就去补了这题 题意: 建最少的边使得给出的点相连. ...
- DFS/并查集 Codeforces Round #286 (Div. 2) B - Mr. Kitayuta's Colorful Graph
题目传送门 /* 题意:两点之间有不同颜色的线连通,问两点间单一颜色连通的路径有几条 DFS:暴力每个颜色,以u走到v为结束标志,累加条数 注意:无向图 */ #include <cstdio& ...
- Codeforces 745C:Hongcow Builds A Nation(并查集)
http://codeforces.com/problemset/problem/744/A 题意:在一个图里面有n个点m条边,还有k个点是受限制的,即不能从一个受限制的点走到另外一个受限制的点(有路 ...
- Codeforces Educational Codeforces Round 5 C. The Labyrinth 带权并查集
C. The Labyrinth 题目连接: http://www.codeforces.com/contest/616/problem/C Description You are given a r ...
- Codeforces Round #245 (Div. 2) B. Balls Game 并查集
B. Balls Game Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/430/problem ...
- Codeforces Round #345 (Div. 1) E. Clockwork Bomb 并查集
E. Clockwork Bomb 题目连接: http://www.codeforces.com/contest/650/problem/E Description My name is James ...
- POJ3694 Network 边双缩点+LCA+并查集
辣鸡错误:把dfs和ldfs搞混...QAQ 题意:给定一个无向图,然后查询q次,求每次查询就在图上增加一条边,求剩余割边的个数. 先把边双缩点,然后预处理出LCA的倍增数组: 然后加边时,从u往上跳 ...
随机推荐
- Ehcache
前言:设计一套缓存框架需要关注的要素 本文来源:RayChase 的<设计一套缓存框架需要关注的要素> 最近关注了一些缓存框架的特性和实现,包括OSCache.JCS.Ehcache.M ...
- Confluence 6 自定义站点和空间布局
你可以通过编辑布局文件来修改 Confluence 的外观和感觉(也可以被称为装饰).编辑这些文件将会允许你对整个 Confluence 站点的外观和感觉进行修改或者仅仅是一个独立的空间. 当你对一个 ...
- pytorch:修改预训练模型
torchvision中提供了很多训练好的模型,这些模型是在1000类,224*224的imagenet中训练得到的,很多时候不适合我们自己的数据,可以根据需要进行修改. 1.类别不同 # codin ...
- django中数据库的配置及相关增删改查
ORM ORM是什么?:(在django中,根据代码中的类自动生成数据库的表也叫--code first) ORM:Object Relational Mapping(关系对象映射) 类名对应---- ...
- Layer-level的快速算法
十岁的小男孩 本文为终端移植的一个小章节. Sparse Block Net 本节为优化加速的第二章节,主要介绍Sparse-block net.上章节为OP算子层的加速,本节为层级间的加速,主要针对 ...
- 极光推送>>java SDK服务端集成后台项目(使用详解)
PS:如果你是第一次用推送,那就直接按照我的步骤来,再去看官方文档,这样,更容易能理解操作流程.还有——-请耐心看 极光文档(java SDK)请参考 [ 极光文档 ] 步骤一: 首先,你必须在 [极 ...
- 【转】asp.net Core 系列【一】——创建Web应用
ASP.NET Core 中的 Razor 页面介绍 Razor 页面是 ASP.NET Core MVC 的一个新功能,它可以使基于页面的编码方式更简单高效. 若要查找使用模型视图控制器方法的教程, ...
- 滴水穿石-04Eclipse中常用的快捷键
一:常用快捷键 1:内容辅助键 :Alt+/ :main + 该快捷键 :自动生成main方法 :syso + 该快捷键 :自动生成System.out.println();语句 :提示作用 :内容 ...
- 爬取豆瓣电影TOP 250的电影存储到mongodb中
爬取豆瓣电影TOP 250的电影存储到mongodb中 1.创建项目sp1 PS D:\scrapy> scrapy.exe startproject douban 2.创建一个爬虫 PS D: ...
- SqlServer 分页存储过程
SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE PROCEDURE [dbo].[usp_CommonDataResourcePaged ...