过了但对数组定义大小有点疑问
查看原帖
过了但对数组定义大小有点疑问
1122611
stickman_stickmin楼主2024/10/13 11:19

首先我的代码:

#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=2e5N<=1e4 \times 20=2e5
M<=5e4×20×4=4e6M<=5e4 \times20 \times4=4e6

然而实测 N=2e5N=2e5 会 re ,只能开 2e62e6M=4e6M=4e6 会 re ,只能开 5e65e6 ,求助为什么会这样

2024/10/13 11:19
加载中...