信息传递(luogu 2661)

本文介绍使用Tarjan算法在有向有环图中寻找最小环的方法。通过遍历图结构,利用深度优先搜索和低点值计算,实现对每个节点的访问,找到构成最小环的节点数量。代码示例展示了如何构建图、进行Tarjan遍历以及输出结果。

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

-->测评传送门

给定 n 个人,每个人可以连上一个人建一条单向边,构成一个有向有环图,求最小环
 
输入样例
5
2 4 2 3 1
输出样例
3

Tarjan扫一遍过

code
#include<stdio.h>
#include<algorithm>
using namespace std;
const int MX=200001;
struct Edge {
    int to,next;
}edge[MX];
int n,k,cnt,top,idx,low[MX],dfn[MX],first[MX],stk[MX];
int ans=MX;
void add(int from,int to) 
{
    edge[++cnt].to=to;
    edge[cnt].next=first[from];
    first[from]=cnt;
}

void Tarjan(int x) 
{
    stk[++top]=x;
    dfn[x]=low[x]=++idx;
    for(int i=first[x];i;i=edge[i].next) {
        int to=edge[i].to;
        if(!dfn[to]) {
            Tarjan(to);
            low[x]=min(low[x],low[to]);
        }
         else low[x]=min(low[x],dfn[to]);
    }
    if(low[x]==dfn[x]) {
        int d,len=0;
        do {
            d=stk[top--];
            len++;
        }while(d!=x);
        if(len!=1)
            ans=min(ans,len);
    }
}

int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;++i) {
        int poi;scanf("%d",&poi);
        add(i,poi);
    }
    for(int i=1;i<=n;++i) if(!dfn[i]) Tarjan(i);
    printf("%d",ans);
    return 0;
}

 

转载于:https://www.cnblogs.com/qseer/p/9747027.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值