Noip2015 D1T2信息传递

博客详细介绍了如何解决Noip2015 D1T2问题,通过深度优先搜索(DFS)策略寻找图中的最小环。在遍历过程中,当遇到已访问过的节点时,可以计算环的大小,并忽略后续的重复环。代码实现提供了算法的具体细节。
摘要由CSDN通过智能技术生成

这里写图片描述
这里写图片描述

  • 题目要求:找最小的环,所以直接dfs搜索。
  • 每次从未找过的点出发,从这个点沿着有向边往下,当碰到已经经过的点,说明有环,这时可以计算这个环的点的个数,即当前点的搜索深度-以搜过的点的深度+1.
  • 一个点被搜过,就可以搜完整个子图,下一次搜到是说明这个连接图里的最小环之前已经找过了,因此不做理会。

    Codes

#include <cmath>
#include <string>
#include <map>
#include <stack>
#include <vector>
#include <set>
#include <queue>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<algorithm>
#define INF 0x3f3f3f3f
#define maxn 200005
using namespace std;
struct edge{
    int to,next;
}e[maxn];
int vis[maxn],deepth[maxn],last[maxn];
int tmp,i,n,ans,cnt,tot;
void add(int x,int y)
{
    tot++;
    e[tot].to=y;
    e[tot].next=last[x];
    last[x]=tot;
}
void dfs(int u,int fa)
{
    vis[u]=cnt;
    deepth[u]=deepth[fa]+1;
    for (int i=last[u];i;i=e[i].next)
    {
        int v=e[i].to;
        if (!vis[v]) dfs(v,u);
        else 
        {
            if (vis[v]==cnt)ans=min(ans,deepth[u]-deepth[v]+1);
        }
    }
}
int main(){
    tot=0;
    ans=1e9;
    scanf("%d",&n);
    for (int i=1;i<=n;i++)
    scanf("%d",&tmp),add(i,tmp);
    cnt=0;
    deepth[0]=0;
    for (int i=1;i<=n;i++)
    {
      if (!vis[i]) cnt++,dfs(i,0);
    }
    printf("%d",ans);
    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值