zoukankan      html  css  js  c++  java
  • P3645-[APIO2015]雅加达的摩天楼【bfs,根号分治】

    正题

    题目链接:https://www.luogu.com.cn/problem/P3645


    题目大意

    (n)个点,(m)条狗,第(i)条狗可以往左或者右跳恰好(p_i)步,开始是(0)号狗,每次跳跃到达一个点可以选择换一条狗,求到(1)号狗所在点的最短路。


    解题思路

    为了方便设(n,m)同级
    对于(p_ileq sqrt n)的狗,(p_i)的种类只有(sqrt n)级别,每条狗能到达的点是(O(n))级别
    对于(p_i>sqrt n)的狗,(p_i)的种类有(O(n))级别,每条狗能到达的点数是(O(sqrt n))级别。

    所以总共的状态数不超过(O(nsqrt n))个,暴力(bfs)就好了。

    对于储存状态可以按照(sqrt n)为分界用两种不同的方式储存,当然还有更暴力的方法就是直接用(bitset)存。

    时间复杂度(O(nsqrt n))


    code

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<queue>
    #include<bitset>
    #include<vector>
    #define mp(x,y) make_pair(x,y)
    using namespace std;
    const int N=3e4+10;
    int n,m,S,T;
    bitset<N>v[N];
    vector<int>s[N];
    queue<pair<pair<int,int> ,int> >q;
    int bfs(){
        for(int i=0;i<s[S].size();i++)
            q.push(mp(mp(S,s[S][i]),0)),v[S][s[S][i]]=1;
        while(!q.empty()){
            int x=q.front().first.first,w=q.front().first.second,d=q.front().second;
            int y=x-w;
            if(y>=0){
                if(y==T)return d+1;
                for(int i=0;i<s[y].size();i++)
                    if(!v[y][s[y][i]])
                        q.push(mp(mp(y,s[y][i]),d+1)),v[y][s[y][i]]=1;
                if(!v[y][w])q.push(mp(mp(y,w),d+1)),v[y][w]=1;
            }
            y=x+w;
            if(y<n){
                if(y==T)return d+1;
                for(int i=0;i<s[y].size();i++)
                    if(!v[y][s[y][i]])
                        q.push(mp(mp(y,s[y][i]),d+1)),v[y][s[y][i]]=1;
                if(!v[y][w])q.push(mp(mp(y,w),d+1)),v[y][w]=1;
            }
            q.pop();
        }
        return -1;
    }
    int main()
    {
        scanf("%d%d",&n,&m);
        for(int i=0;i<m;i++){
            int x,w;
            scanf("%d%d",&x,&w);
            if(i==0)S=x;
            if(i==1)T=x;
            s[x].push_back(w);
        }
        if(S==T)return puts("0")&0;
        printf("%d
    ",bfs());
        return 0;
    }
    
  • 相关阅读:
    jQuery火箭图标返回顶部代码
    jQuery火箭图标返回顶部代码
    jQuery火箭图标返回顶部代码
    redis被攻击,怎么预防
    Redis3.2.12单节点安装
    Linux安装Redis、后台运行、系统自启动
    Redis 密码设置和查看密码
    Redis protected-mode属性解读
    SpringCloud(9)----mysql实现配置中心
    SpringCloud(8)----zuul权限校验、接口限流
  • 原文地址:https://www.cnblogs.com/QuantAsk/p/14327071.html
Copyright © 2011-2022 走看看