codeforces-1027D-Mouse Hunt(dfs+并查集 / 缩点+找出度为0的点)

在1027D-Mouse Hunt问题中,目标是确保无论老鼠初始位置在哪,都能通过放置捕鼠夹捕获它。题目涉及n个房间和1只老鼠,每间房放置捕鼠夹有成本。通过DFS搜索环形路径,并使用并查集找到多个环状路径,确保所有路径至少覆盖一个捕鼠夹。Tarjan算法用于找出强连通分量,并寻找出度为0的节点,以实现最小总成本。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目
有 nnn 间屋子和 111 只老鼠,老鼠会从第 iii 间房子跑到 aia_iai​ 间房子。在每间房子放捕鼠夹都有代价 cic_ici​,而老鼠的初始位置可能是任何一个房间,为了保证抓到老鼠(无论老鼠在哪个房间,总有一种路径会经过有捕鼠夹的房子),你需要在若干房间放上捕鼠夹,求最小代价和。
数据范围:1⩽ai​⩽n⩽2⋅10^5 ----1⩽ci⩽10^4.

题解:
在这里插入图片描述
(1)由于每个点的出度为0 所以形成的环是可以通成一条路的。所以 dfs一下这个环。找到最小值。就是需要在这个处放一个夹子。解决这一个环内的老鼠。并查集找到这样的多个环。
(2)这个环也是一个强连通分量。用tarjan对这些染色。找分量中出度为0的。每个分量用vector排序找到最小的。

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#define m(a,b) memset(a,b,sizeof a)
using namespace std;
typedef long long ll;
const int N=2e5+5;
struct Edge{
   
   int to,nex;}edge[N*100];
int head[N],vis[N],dfn[N],low[N],st[N],col[N],out[N],val[N];
int tot,cnt,index,color;
vector<int>vec[N];
void add(int from,int to)
{
   
   
    edge[++tot]=(Edge){
   
   to,head[from]};head[from]=tot;
}
void tarjan(int x)
{
   
   
    dfn[x]=low[x]=++cnt;
    st[++index]=x,vis[x]=1;
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值