求算k短路代码的内存
查看原帖
求算k短路代码的内存
571182
青涩的Lemon楼主2024/10/14 19:28

魔法猪学院A*MLE了 代码如下,求帮忙分析一下为什么会爆128mb

#include<bits/stdc++.h>
using namespace std;
const int maxn=2e5+5;
const int inf=1e8;
const double eps=1e-7;
int n,m,k,a,b,vis[5005],ans;
double dis[5005],E;//t到i的最短路
struct edge{
    int v;
    double val;
    edge(int a,double b){v=a;val=b;}
};
vector<edge>g[5005],G[5005];
struct node{
    int u;
    double dis;
    node(int a,double b){u=a;dis=b;}
    bool operator <(const node &x)const{return dis>x.dis;}
};
void dij(int s){
    for(int i=1;i<=n;i++) dis[i]=inf,vis[i]=0;
    dis[s]=0;
    priority_queue<node>q;
    q.push(node{s,dis[s]});
    while(!q.empty()){
        int u=q.top().u;
        q.pop();
        if(vis[u]) continue;
        vis[u]=1;
        for(int i=0;i<G[u].size();i++){
            int v=G[u][i].v;
            int w=G[u][i].val;
            if(dis[u]+w<=dis[v]){
                dis[v]=dis[u]+w;
                q.push(node{v,dis[v]});
            }
        }
    }
}
struct p{//估价函数
    int v;
    double g,h;
    p(int a,double b,double c){v=a;g=b;h=c;}
    bool operator <(const p &x)const{return g+h>x.g+x.h;}
};
void astar(int s,int t){
    priority_queue<p>q;
    q.push(p{s,0,0});
    while(!q.empty()){
        p x=q.top();
        int u=q.top().v;
        q.pop();
        if(x.g+x.h-eps>E) break;
        if(x.v==n){
            ans++;
            E-=(x.g+x.h);
            continue;
        }
        for(int i=0;i<g[u].size();i++){
            if(x.g+g[u][i].val<=E)
                q.push(p{g[u][i].v,x.g+g[u][i].val,dis[g[u][i].v]});
        }
    }
}
int main(){
    scanf("%d%d%lf",&n,&m,&E);
    for(int i=1;i<=m;i++){
        int u,v;;
        double w;
        scanf("%d%d%lf",&u,&v,&w);
        g[u].push_back(edge{v,w});
        G[v].push_back(edge{u,w});//反图
    }
    dij(n);
    astar(1,n);
    printf("%d\n",ans);
    return 0;
}
2024/10/14 19:28
加载中...