真的不能用一个类表示 a+2b−1,然后做一次分层图dij吗?
#include <bits/stdc++.h>
using namespace std;
const int N=200007,mod=998244353;
int pw[N<<1];
vector<int> to[N<<1];
struct num{
int a,b;
bool operator<(const num o)const{
if(max(b,o.b)>21){
if(b==o.b) return a<o.a;
return b<o.b;
}
return a+pw[b]<o.a+pw[o.b];
}
operator int()const{int u=a+pw[b]-1;if(u>=mod)u-=mod;if(u<0)u+=mod;return u;}
} f[N<<1];
struct node{
int pos;
num val;
bool operator<(const node o)const{return o.val<val;}
}; priority_queue<node> q;
bool vis[N<<1];
int main(){
cin.tie(0)->sync_with_stdio(0);
int n,m;
cin>>n>>m;
pw[0]=1;
for(int i=1;i<(N<<1);i++) if((pw[i]=pw[i-1]<<1)>=mod) pw[i]-=mod;
for(int i=1,u,v;i<=m;i++) cin>>u>>v,to[u*2].push_back(v*2),to[v*2+1].push_back(u*2+1);
for(int i=1;i<=n;i++) to[i*2].push_back(i*2+1),to[i*2+1].push_back(i*2);
memset(f,'?',sizeof(f));
q.push({2,f[2]={0,0}});
while(!q.empty()){
int u=q.top().pos;
q.pop();
if(vis[u]) continue;
vis[u]=1;
for(auto i:to[u]) if((i^u)&1){
num v=f[u];v.b++;
if(v<f[i]) q.push({i,f[i]=v});
}else{
num v=f[u];v.a++;
if(v<f[i]) q.push({i,f[i]=v});
}
}
cout<<int(min(f[n*2],f[n*2+1]))<<'\n';
return 0;
}