首先我的代码:
#include<bits/stdc++.h>
using namespace std;
const int N=2e6+20,M=5e6+10;
struct edge{
int to,nxt,w;
}e[M];
int head[N],tot;
void adg(int u,int v,int w){
e[++tot]=(edge){v,head[u],w};
head[u]=tot;
}
int n,m,k;
int s,t;
struct node{
int id,dis;
node(int a,int b){id=a,dis=b;}
bool operator <(const node &a)
const{return a.dis<dis;}//转为小根堆
};
int dist[N-10],vis[N-10];
void dijkstra(int s){
fill(dist+1,dist+n*(k+1)+1,0x7fffffff);
priority_queue<node> q;
dist[s]=0;
q.push(node(s,dist[s]));
while(q.size()){
node u=q.top();
q.pop();
if(vis[u.id])continue;
vis[u.id]=1;
for(int i=head[u.id];i;i=e[i].nxt){
int v=e[i].to,w=e[i].w;
if(vis[v])continue;
if(dist[v]>dist[u.id]+w){
dist[v]=dist[u.id]+w;
q.push(node(v,dist[v]));
}
}
}
}
int main(){
cin>>n>>m>>k;
s=1,t=n;
for(int i=1;i<=m;i++){
int u,v,w;
cin>>u>>v>>w;
int tu=u,tv=v;
for(int j=0;j<=k;j++){
u=tu+n*j,v=tv+n*j;
adg(u,v,w);
adg(v,u,w);
if(j!=k){
adg(u,v+n,0);
adg(v,u+n,0);
}
}
}
dijkstra(s);
int ans=0x7fffffff;
for(int i=0;i<=k;i++){
ans=min(ans,dist[t+n*i]);
}
cout<<ans<<'\n';
return 0;
}
按理来说N<=1e4×20=2e5
M<=5e4×20×4=4e6
然而实测 N=2e5 会 re ,只能开 2e6 ,M=4e6 会 re ,只能开 5e6 ,求助为什么会这样