Educational Codeforces Round 49 (Rated for Div. 2) D. Mouse Hunt

题意:

有n个房间,保证每一个房间只会通向另一个房间,有一只老鼠,初始房间不一定,它会在相通的房间内乱窜,你有无数个老鼠夹,可以放到任意房间内,保证老鼠已进入该房间就会被抓住,在不同的房间内放老鼠夹都会有一个对应的代价,问最少花费多少的代价,才能保证老鼠不管初始在哪个房间内都会被抓住。

思路:

tarjan+缩点,将一个强连通块缩为一个点,这个点的val为这个强连通块里的最小val,然后统计缩点后的DAG图里所有出度为0的点的val和就是答案。

#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 10;
int n, c[N], h[N], cnt, dfn[N], low[N], inde, val[N], ins[N], bel[N], x[N], chu[N], ans, minn[N];
stack<int> s;
struct node {
    int v, net;
} no[N];
void add(int u, int v) {
    no[cnt].v = v;
    no[cnt].net = h[u];
    h[u] = cnt++;
}
void tarjan(int u) {
    int v;
    s.push(u);
    dfn[u] = low[u] = ++inde;
    ins[u] = 1;
    for(int i = h[u]; ~i; i = no[i].net) {
        v = no[i].v;
        if(!dfn[v]) {
            tarjan(v);
            low[u] = min(low[u], low[v]);
        } else if(ins[v])
            low[u] = min(low[u], dfn[v]);
    }
    if(dfn[u] == low[u]) {
        minn[u] = min(minn[u], val[u]);
        while(s.top() != u) {
            v = s.top();
            s.pop();
            bel[v] = u, ins[v] = 0;
            minn[u] = min(minn[u], val[v]);
        }
        s.pop();
        ins[u] = 0, bel[u] = u;
    }
}
int main() {
    cin >> n;
    memset(h, -1, sizeof h);
    memset(minn, 0x3f, sizeof minn);
    for(int i = 1; i <= n; i++) {
        cin >> val[i];
    }
    for(int i = 1; i <= n; i++) {
        cin >> x[i];
        add(i, x[i]);
    }
    for(int i = 1; i <= n; i++)
        if(!dfn[i])
            tarjan(i);
    for(int i = 1; i <= n; i++)
        if(bel[i] != bel[x[i]])//强连通分量的出度个数
            chu[bel[i]]++;
    for(int i = 1; i <= n; i++)
        if(!chu[i])
            ans += minn[bel[i]], minn[bel[i]] = 0;//加完后置为0,防止重复加
    cout << ans;
    return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
"educational codeforces round 103 (rated for div. 2)"是一个Codeforces平台上的教育性比赛,专为2级选手设计评级。以下是有关该比赛的回答。 "educational codeforces round 103 (rated for div. 2)"是一场Codeforces平台上的教育性比赛。Codeforces是一个为程序员提供竞赛和评级的在线平台。这场比赛是专为2级选手设计的,这意味着它适合那些在算法和数据结构方面已经积累了一定经验的选手参与。 与其他Codeforces比赛一样,这场比赛将由多个问题组成,选手需要根据给定的问题描述和测试用例,编写程序来解决这些问题。比赛的时限通常有两到三个小时,选手需要在规定的时间内提交他们的解答。他们的程序将在Codeforces的在线评测系统上运行,并根据程序的正确性和效率进行评分。 该比赛被称为"educational",意味着比赛的目的是教育性的,而不是针对专业的竞争性。这种教育性比赛为选手提供了一个学习和提高他们编程技能的机会。即使选手没有在比赛中获得很高的排名,他们也可以从其他选手的解决方案中学习,并通过参与讨论获得更多的知识。 参加"educational codeforces round 103 (rated for div. 2)"对于2级选手来说是很有意义的。他们可以通过解决难度适中的问题来测试和巩固他们的算法和编程技巧。另外,这种比赛对于提高解决问题能力,锻炼思维和提高团队合作能力也是非常有帮助的。 总的来说,"educational codeforces round 103 (rated for div. 2)"是一场为2级选手设计的教育性比赛,旨在提高他们的编程技能和算法能力。参与这样的比赛可以为选手提供学习和进步的机会,同时也促进了编程社区的交流与合作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值