Codeforces 1027D Mouse Hunt 题解

博客探讨了Codeforces 1027D题目的解法,老鼠会在n个房间中移动,每秒从当前房间移动到指定的下一房间。目标是设计陷阱布局以确保无论老鼠从哪个房间开始,都能被捕获,同时降低成本。解决方案涉及构建老鼠的走向图,寻找强连通分量,特别是出度为0的分量,在这些分量中选取最小成本的房间放置陷阱。最后,将所有出度为0强连通分量的最小成本相加得到总成本。

博客观赏效果更佳

题意简述

n个房间,有一只老鼠可能出现在任意一个房间,并且老鼠在第i个房间出现时,下一秒就会运动到第ai个房间。需要放陷阱确保老鼠不管在哪里出现都会被抓。在第i个房间放陷阱成本ci,输出最少需要多少成本完成题目要求
(vjudge翻译)(又是蒯的)

思路框架

我们把 i i i a i a_i ai连边,就得到了老鼠的走向图。然后我们在走向图上找到所有强连通分量。显然,同一个强连通分量(由于每个点有且仅有唯一的出边,所以一个强连通分量肯定就是一个环)中,我们只要在其中一个位置布置陷阱即珂。那么我们就在花费最小的位置布置好了。

那么,哪些强连通分量中要布置陷阱呢?只有缩点后出度为 0 0 0的强连通分量需要布置,因为别的强连通分量会不断的往下走,肯定会走到一个出度为 0 0 0的强连通分量。

总结一下思路:

  1. 找出所有强连通分量,求出里面最小的花费,令它为这个强连通分量的花费。
  2. 答案=所有出度为0的强连通分量花费的和。

代码


#include <bits/stdc++.h>using namespace std;
namespace Flandre_Scarlet
{
   
   
    #define N 255555
    #define F(i,l,r) for(int i=l;i<=r;++i)
    #define D(i,r,l) for(int i=r;i>=l;--i)
    #define Fs(i,l,r,c) for(int i=l;i<=r;c)
    #define Ds(i,r,l,c) for(int i=r;i>=l;c)
    #define MEM(x,a) memset(x,a,sizeof(x))
    #define FK(x) MEM(x,0)
    #define Tra(i,u) for(int i=G.Start(u),__v=G.To(i);~i;i=G.Next(i),__v=G.To(i))
    #define p_b push_back
    #define sz(a) ((int)a.size())
    #define iter(a,p) (a.begin()+p)

    class Graph
    {
   
   
        public:
            int head[N];
            int EdgeCount;
            struct Edge
            {
   
   
                int To,Label,Next;
            }Ed[N<<1];
            void clear(int _V=N,int _E=N<<1) 
            {
   
   
                memset(Ed,-1,sizeof(Edge)*(_E))</
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值