• BFS小结


    其实bfs本身不难,甚至不需要去学习,只要知道它的特性就可以写出来了。往往,bfs都是用递归做的。递归比循环更容易timeout。所以这次遇到一题bfs,卡时间的就悲剧了。

    PAT1076

    #include<iostream>
    #include<cstdio>
    #include<cstdlib>
    #include<cstring>
    #include<algorithm>
    #include<vector>
    #include<queue>
    using namespace std;
    #define N (1000+10)
    #define INF (1<<30)
    vector<int> Map[N];
    int vis[N];
    int Hash[N];
    int n,m;
    int res,ans[N];
    void bfs(vector<int> vi,int cnt)
    {
        int nsize = vi.size();
        if(nsize==0) return;
        if(cnt == m+1){return;}
        ++cnt;
        vector<int> vnext;
        for(int i=0;i<nsize;++i)
        {
            int val = vi[i];
            vis[val] = 1;
            //printf("[%d] ",vi[i]+1);
            int nMapSize = Map[vi[i]].size();
            if(!Hash[val])
            {
                ++res;
                Hash[val] = 1;
            }
            for(int j=0;j<nMapSize;++j)
            if(vis[Map[val][j]]==0 && Hash[Map[val][j]]==0)
            {
                vnext.push_back(Map[val][j]);
            }
        }
        //printf("
    ");
        if(vnext.size());
            bfs(vnext,cnt);
        for(int i=0;i<nsize;++i)
            vis[vi[i]] = 0;
    }
    int l;
    void bfs2(int k)
    {
        queue<int> qi;
        qi.push(k);
        int presize = 1;
        while(!qi.empty())
        {
            int val = qi.front();
            qi.pop();
            ++res;
            vis[val] = 1;
            for(int i=0;i<Map[val].size();++i)
            {
                int mapval = Map[val][i];
                if(vis[mapval]==0)
                {
                    vis[mapval] = 1;
                    qi.push(mapval);
                    //printf("[%d] ",mapval+1);
                }
            }
            --presize;
            if(presize==0)
            {
                //printf("
    ");
                ++l;
                presize = qi.size();
            }
            if(l==m+1) break;
        }
    
        res = res > 0 ? res-1 : 0;
    }
    
    int main()
    {
        scanf("%d%d",&n,&m);
        for(int i=0;i<n;++i)
        {
            int k;
            scanf("%d",&k);
            for(int j=0;j<k;++j)
            {
                int s=i,e;
                scanf("%d",&e);
                --e;
                //反向
                Map[e].push_back(s);
            }
        }
        int k;
        scanf("%d",&k);
        for(int i=0;i<k;++i)
        {
            int s;
            scanf("%d",&s);
            --s;
            /*vector<int> vi;
            vi.push_back(s);
            res = 0;
            memset(Hash,0,sizeof(int)*(n+10));
            memset(vis,0,sizeof(vis));
            Hash[s] = 1;
            bfs(vi,0);
            */
            res = 0;
            l = 0;
            memset(vis,0,sizeof(vis));
            bfs2(s);
            printf("%d
    ",res);
        }
        return 0;
    }
    View Code
  • 相关阅读:
    Bootstrap-datepicker3官方文档中文翻译---Methods/方法(原文链接 http://bootstrap-datepicker.readthedocs.io/en/latest/index.html)
    Bootstrap-datepicker3官方文档中文翻译---Options/选项(原文链接 http://bootstrap-datepicker.readthedocs.io/en/latest/index.html)
    IOI2020集训队作业
    校内集训作业题
    CF题目泛做 3
    CF题目泛做 2
    CF题目泛做1
    NOIP2020
    相邻交换法 & 皇后游戏
    Codeforces Round #679 Div.1
  • 原文地址:https://www.cnblogs.com/jlyg/p/7489727.html
Copyright © 2020-2023  润新知