码迷,mamicode.com
首页 > Windows程序 > 详细

Luogu P3645 [APIO2015]雅加达的摩天楼

时间:2019-10-31 23:34:34      阅读:154      评论:0      收藏:0      [点我收藏+]

标签:pac   return   its   turn   can   ack   tuple   ref   scan   

题目
直接BFS求01最短路。
因为状态是\(O(n\sqrt n)\)级别的所以没有问题。
注意判断某个hl是否经过某个点要用bitset。

#include<bits/stdc++.h>
#define pb push_back
using namespace std;
const int N=30007;
vector<int>dog[N];
bitset<N>vis[N];
queue<tuple<int,int,int>>q;
int used[N],n,m,s,t;
int read(){int x;scanf("%d",&x);return x;}
void move(int p,int id,int step)
{
    if(!used[p])
    {
        used[p]=1;
        for(int x:dog[p]) if (!vis[p][x]) vis[p][x]=1,q.emplace(p,x,step);
    }
    if(~id&&!vis[p][id]) vis[p][id]=1,q.emplace(p,id,step);
}
int main()
{
    n=read(),m=read();int i,b,p,step;
    for(i=0;i^m;++i)
    {
    b=read(),p=read();
    if(!i) s=b;
    if(i==1) t=b;
    dog[b].pb(p);
    }
    if(s==t) return !printf("0");
    move(s,-1,0);
    while(!q.empty())
    {
        tie(b,p,step)=q.front(),q.pop();
        if(b==t) return !printf("%d",step);
        if(b-p>=0) move(b-p,p,step+1);
        if(b+p<n) move(b+p,p,step+1);
    }
    return !printf("-1");
}

Luogu P3645 [APIO2015]雅加达的摩天楼

标签:pac   return   its   turn   can   ack   tuple   ref   scan   

原文地址:https://www.cnblogs.com/cjoierShiina-Mashiro/p/11774267.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!