Codeforces1027D-Mouse Hunt

本文介绍了一种利用强连通分量解决特定问题的算法。通过寻找图中的强连通分量并进行缩点操作,最终计算出所有出度为0的强连通分量中节点值的最小值之和。

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


题解:
还是比较水的一道题
先找强连通分量缩点,然后把所有出度为0的强连通分量内c[i]c[i]的最小值相加就是答案
注意自环!
CodeCode:

#include<cstdio>
#include<cstring>
#include<algorithm>
#define N 200005
using namespace std;
int tot,head[N],n,c[N],a[N],low[N],dfn[N],mn[N],Q[N];
int flag[N],deep,color[N],top,sum,Head[N],Tot,out[N];
struct node
{
    int vet,next;
}edge[N],Edge[N];
void add(int u,int v)
{
    edge[++tot]=(node){v,head[u]};
    head[u]=tot;
}
void Add(int u,int v)
{
    Edge[++Tot]=(node){v,Head[u]};
    Head[u]=Tot;
}
void tarjan(int u)
{
    low[u]=dfn[u]=++deep;
    Q[++top]=u;flag[u]=true;
    for(int i=head[u];i;i=edge[i].next)
    {
        int v=edge[i].vet;
        if(!dfn[v])
        {
            tarjan(v);
            low[u]=min(low[u],low[v]);
        }else if(flag[v])
            low[u]=min(low[u],low[v]);
    }
    if(low[u]==dfn[u])
    {
        color[u]=++sum;
        flag[u]=0;
        while(Q[top]!=u)
        {
            flag[Q[top]]=false;
            color[Q[top--]]=sum;
        }
        top--;
    }
}
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)scanf("%d",&c[i]);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&a[i]);
        if(a[i]!=i)add(i,a[i]);
    }
    for(int i=1;i<=n;i++)
        if(!dfn[i])tarjan(i);
    memset(mn,0x3f3f3f,sizeof(mn));
    for(int i=1;i<=n;i++)
    {
        mn[color[i]]=min(mn[color[i]],c[i]);
        if(color[i]!=color[a[i]]&&i!=a[i])
        {
            Add(color[i],color[a[i]]);
            out[color[i]]++;
        }
    }
    int ans=0;
    for(int i=1;i<=sum;i++)
        if(!out[i])ans+=mn[i];
    printf("%d\n",ans);
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JackflyDC

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值