[BZOJ 3040] 最短路(road) · 堆优化dijkstra

本文详细介绍了如何使用堆优化的Dijkstra算法来解决特定问题中的空间限制,通过实例演示了初始化、堆操作以及核心的Dijkstra算法实现过程。重点在于展示在资源受限环境下,通过优化数据结构提升算法效率的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

堆优化dijkstra写法很多,我用的是系统堆priority_queue,见上一篇blog

这题空间卡的太紧了

#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <queue>
using namespace std;
#define ll long long
 
const int M=10000005;
const int N=1000005;
int node[M],nxt[M],head[N];
int n,m,tot;
int i,j;
ll d[N],data[M];
ll T,rxa,rxc,rya,ryc,rp;
 
void add(int x,int y,ll z){
    node[++tot]=y;nxt[tot]=head[x];head[x]=tot;data[tot]=z;
}
 
void init(){
    long long x,y,z,a,b,l;
    x=y=z=0;
    scanf("%lld%lld%lld%lld%lld%lld",&T,&rxa,&rxc,&rya,&ryc,&rp);
    for (i=1;i<=T;i++){  
        x=(x*rxa+rxc)%rp;
        y=(y*rya+ryc)%rp;
        a=min(x%n+1,y%n+1);
        b=max(y%n+1,y%n+1);
        l=(ll)1e8-100*a;
        add(a,b,l);
    }
     
    tot=0;
    memset(head,0,sizeof head);
    for (i=T+1;i<=m;i++){
        scanf("%lld%lld%lld",&x,&y,&z);
        add(x,y,z);
    }
}
 
void Dij(){
    memset(d,10,sizeof d);d[1]=0;
    priority_queue<pair<long long,int> > heap;
    heap.push(make_pair(-d[1],1));
    for (;;){
        for (;!heap.empty() && -d[heap.top().second]!=heap.top().first;heap.pop());
        if (heap.empty()) break;
         
        int now=heap.top().second;
        heap.pop();
             
        for (i=head[now];i;i=nxt[i]){
            j=node[i];
            if (d[j]>d[now]+data[i]){
                d[j]=d[now]+data[i];
                heap.push(make_pair(-d[j],j));
            }
        }
    }
}
 
int main(){
    scanf("%d%d",&n,&m);
    init();
    Dij();
    printf("%lld\n",d[n]);
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值