首页 > 其他分享 >堆优化dijkstra的两种写法

堆优化dijkstra的两种写法

时间:2022-09-04 17:22:47浏览次数:72  
标签:int 写法 back dijkstra que push dis 优化 define

例题:

https://www.acwing.com/problem/content/description/1131/

1、仅用dis数组记录,出队时记录最小距离

#include<bits/stdc++.h>

#define fore(x,y,z) for(LL x=(y);x<=(z);x++)
#define forn(x,y,z) for(LL x=(y);x<(z);x++)
#define rofe(x,y,z) for(LL x=(y);x>=(z);x--)
#define rofn(x,y,z) for(LL x=(y);x>(z);x--)
#define pb push_back
#define all(x) (x).begin(),(x).end()
#define fi first
#define se second

using namespace std;
typedef long long LL;
typedef pair<int,int> PII;
typedef pair<LL,LL> PLL;

int n,m,s,t;
vector<int> adj[3000];
vector<int> cost[3000];
int dis[3000];
void Dijkstra()
{
    memset(dis,0x3f,sizeof(dis));
    priority_queue<PII,vector<PII>,greater<PII>> que;
    que.push({0,s});
    while(que.size())
    {
        PII dis_u=que.top();
        que.pop();
        

        
        if(dis[dis_u.se]<=dis_u.fi) continue;
        
        dis[dis_u.se]=dis_u.fi;
        if(dis_u.se==t) break;
        int sz=adj[dis_u.se].size();
        for(int i=0;i<sz;i++)
        {
            if(dis_u.fi+cost[dis_u.se][i]<dis[adj[dis_u.se][i]])
                que.push({dis_u.fi+cost[dis_u.se][i],adj[dis_u.se][i]});
        }
        
    }
}
void YD()
{
    cin>>n>>m>>s>>t;
    while(m--)
    {
        int a,b,c;cin>>a>>b>>c;
        adj[a].push_back(b);
        cost[a].push_back(c);
        adj[b].push_back(a);
        cost[b].push_back(c);
    }
    Dijkstra();
    cout<<dis[t]<<endl;
}
 
int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    int T=1;
    //cin >> T;
    while (T--)
    {
        YD();
    }
    return 0;
}
View Code

2、用dis和vis数组记录,入队时更新最小距离,出队时更新vis数组

#include<bits/stdc++.h>

#define fore(x,y,z) for(LL x=(y);x<=(z);x++)
#define forn(x,y,z) for(LL x=(y);x<(z);x++)
#define rofe(x,y,z) for(LL x=(y);x>=(z);x--)
#define rofn(x,y,z) for(LL x=(y);x>(z);x--)
#define pb push_back
#define all(x) (x).begin(),(x).end()
#define fi first
#define se second

using namespace std;
typedef long long LL;
typedef pair<int,int> PII;
typedef pair<LL,LL> PLL;

int n,m,s,t;
vector<int> adj[3000];
vector<int> cost[3000];
int dis[3000];
bool vis[3000];
void Dijkstra()
{
    memset(dis,0x3f,sizeof(dis));
    priority_queue<PII,vector<PII>,greater<PII>> que;
    que.push({0,s});
    dis[s]=0;
    
    while(que.size())
    {
        PII dis_u=que.top();
        que.pop();

        if(vis[dis_u.se]) continue;
        vis[dis_u.se]=true;
        
        if(dis_u.se==t) break;
        
        int sz=adj[dis_u.se].size();
        
        for(int i=0;i<sz;i++)
        {
            if(dis_u.fi+cost[dis_u.se][i]<dis[adj[dis_u.se][i]])
            {
                dis[adj[dis_u.se][i]]=dis_u.fi+cost[dis_u.se][i];
                que.push({dis_u.fi+cost[dis_u.se][i],adj[dis_u.se][i]});
            }
                
        }
        
    }
}
void YD()
{
    cin>>n>>m>>s>>t;
    while(m--)
    {
        int a,b,c;cin>>a>>b>>c;
        adj[a].push_back(b);
        cost[a].push_back(c);
        adj[b].push_back(a);
        cost[b].push_back(c);
    }
    Dijkstra();
    cout<<dis[t]<<endl;
}
 
int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    int T=1;
    //cin >> T;
    while (T--)
    {
        YD();
    }
    return 0;
}
View Code

 疑似第二种更快,第一种更好写

标签:int,写法,back,dijkstra,que,push,dis,优化,define
From: https://www.cnblogs.com/ydUESTC/p/16655477.html

相关文章

  • mysql索引优化
    一、分页查询优化很多时候我们业务系统实现分页功能可能会用如下sql实现:select*fromemployeeslimit10000,10;表示从表employees中取出从10001行开始的10行......
  • 响应式模版移动优化
    本文重点介绍做SEO响应式模版移动优化:响应式模版是指只有一套模版,pc和手机端共用一套模版,模版可根据浏览窗口自适应,只有一个www的连接。 响应式模版优化需做以下几点:1......
  • Centos7 常用优化脚本
    #!/bin/bash#服务器一键优化工具functiondefine_check_network(){echo主机名为`hostname-f`pingwww.baidu.com-c6}functiondefine_yum(){#......
  • 最短路算法之 Dijkstra
    部分内容参考了李煜东的《算法竞赛进阶指南》,在此声明。单源最短路径单源最短路径问题,是说,给定一张有向图(无向图)\(G=(V,E)\),\(V\)是点集,\(E\)是边集,\(|V|=n\),\(|......
  • 性能优化 1 - 减小 Bundle 大小(React、Webpack、Minify、代码拆分)
    性能优化1-减小Bundle大小(React、Webpack、Minify、代码拆分)Photoby杰克逊·西默on不飞溅优化JavaScript和React性能的方法之一是尽可能减小通过Webpac......
  • 系统优化-----sysctl.conf文件内核设置参数详解
    系统优化-----sysctl.conf文件内核设置参数详解_tallercc的博客-CSDN博客 https://blog.csdn.net/tallercc/article/details/52823075sysctl.conf工作原理 sysctl命......
  • 并发的核心:CAS 是什么?Java8是如何优化 CAS 的?
    大家可能都听说说Java中的并发包,如果想要读懂Java中的并发包,其核心就是要先读懂CAS机制,因为CAS可以说是并发包的底层实现原理。今天就带大家读懂CAS是......
  • 并发的核心:CAS 是什么?Java8是如何优化 CAS 的?_2
    大家可能都听说说Java中的并发包,如果想要读懂Java中的并发包,其核心就是要先读懂CAS机制,因为CAS可以说是并发包的底层实现原理。今天就带大家读懂CAS是......
  • synchronized在Jdk1.6后的底层优化分析
    JDK1.6对synchronized锁的实现引入了大量的优化来减少锁操作的开销,如: 偏向锁、轻量锁、自旋锁、适应性自旋锁、锁消除、锁粗化 等等技术。讲synchronized之前,先说一些......
  • 单调队列优化dp与斜率优化dp
    单调队列优化dp是个相对比较不显然的优化。例题:P2034选择数字题意:一串正整数,选择若干个数使和最大,且没有连续的超过k个数被选择。首先显然是个dp题。方程也比较显然。......