zoukankan      html  css  js  c++  java
  • 搜索——迭代加深

    cdcq学长又再次讲了迭代加深搜索,这个搜索呢是由bfs扩展的方向太多而dfs一条路走到黑很有可能GG,所以采用迭代加深搜索,就是限定一个范围来进行搜索,外形是dfs内部有一个搜索那就是bfs,每次扩展的边再来进行dfs这样的话相对于dfsorbfs答案在很小的地方效率会极高。

    一道迭代加深入门题路过,一棵树,找到层数最小的根节点。一个n,n-1行,输入两个数,前一个根节点,后一个父亲节点。

    关键就是for(int i=1;;i++)dfs(int x,int y,int  z)if(y==z)return;dfs(x,y+1,z);这样是迭代加深的基本通式.

    代码:

    #include<iostream>
    #include<iostream>
    #include<iomanip>
    #include<cstdio>
    #include<ctime>
    #include<cstring>
    #include<cmath>
    #include<algorithm>
    #include<string>
    #include<queue>
    #include<vector>
    #include<map>
    using namespace std;
    inline int read()
    {
        int x=0,f=1;char ch=getchar();
        while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
        while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
        return x*f;
    }
    const int maxn=100008;
    int lin[maxn],ver[maxn],len=0,nex[maxn];
    int n;
    void add(int x,int y)
    {
        ver[++len]=y;
        nex[len]=lin[x];
        lin[x]=len;
    }
    int dfs(int x,int y,int z)
    {
        if(lin[x]==0)return 1;
        if(y==z){return 0;}
        for(int i=lin[x];i;i=nex[i])
        if(dfs(ver[i],y+1,z)==1)return 1;
        return 0;
    }
    int main()
    {
        //freopen("1.in","r",stdin);
        n=read();
        if(n==1)
        {    printf("%d
    ",1);return 0;}
        for(int i=1;i<=n-1;i++)
        {
            int x,y;
            x=read();y=read();
            add(y,x);
        }
        for(int i=1;;i++)
            if(dfs(1,1,i)==1){printf("%d
    ",i);return 0;}
        return 0;
    }
    View Code

    VFK说过一句话
    “暴力A了就A了吧……用暴力A掉此题对于写程序的人来说没有任何益处,对我更没坏处。”

  • 相关阅读:
    第二高的薪水
    leecode 删除排序数组中的重复项
    leecode 17. 电话号码的字母组合
    dubbo 限流之TpsLimitFilter
    G1总结
    leecode 3. 无重复字符的最长子串
    mysql是如何解决脏读、不可重复读、幻读?
    归并排序
    PostgreSQL管理数据库安全
    Oracle Database 19c 技术架构(三)
  • 原文地址:https://www.cnblogs.com/chdy/p/9736406.html
Copyright © 2011-2022 走看看