ABC132E Hopscotch Addict 题解

看了一下题解,发现全是把一个点拆成三个点然后跑分层图最短路的,但是我一看感觉就是普通的 bfs。

题意是在图内询问从 st 是否存在长度为 3 的路径。不妨开一个数组,visi,j 表示是否存在从点 s 出发,是否存在长度模 3j 的路线。那么每次更新就是 visv,(x+1)mod3=visu,x,这样复杂度是 O(n+m) 的。

很短而且很快的 code:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cassert>
#include<queue>
#define siz(x) (int)(x).size()
using std::cin;using std::cout;
constexpr int kN=1e5+1;
std::basic_string<int>g[kN];
using pii=std::pair<int,int>;
bool vis[kN][3];
int n,m,s,t;
signed main(){
// freopen("checkers.in","r",stdin);
// freopen("checkers.out","w",stdout);
std::ios::sync_with_stdio(false);cin.tie(nullptr);
cin>>n>>m;
for(int i=1,u,v;i<=m;i++)cin>>u>>v,g[u]+=v;
cin>>s>>t;vis[s][0]=true;
std::queue<pii>q({{s,0}});
while(!q.empty()){
auto[u,x]=q.front();x++;q.pop();
for(int v:g[u])if(!vis[v][x%3]){
if(v==t&&x%3==0)return cout<<x/3,0;
vis[v][x%3]=true;
q.emplace(v,x);
}
}
cout<<"-1";
// std::cerr<<"\033[33;40muse "<<clock()<<" ms\033[37;40m";
return 0;
}

哎呀用 basic_string 存图,多是一件美事啊!哎呀,啧啧啧啧,不快不慢(指比 vector 快但是略慢于链式前向星),效果真是好极了。这位巨佬,看看,没事吧,用吧,赶快用吧。巨佬,你得带个头,你要不带头用。他,他们怎么能,能敢用呢?诶,都,都 都看我干什么呀?用呀 用呀 用,快,快,赶快用,嘿,赶快用呀!(突然变脸)哎!!!TNND,为什么不用?用!用!不 不用…不用是吧,不用,不用我就啊了你!都不敢用,都怕超时是吧。我告诉你,不用?不用也别想减小码量( basic_string 语法糖,插入可以使用 += 运算符)!既然大家都知道了,这戏我也就不演了……(后省略好多字)

posted @   蒟酱  阅读(69)  评论(1编辑  收藏  举报
相关博文:
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
点击右上角即可分享
微信分享提示