vector存图解决最短路(带堆优化)

HDU 2544 最短路【Dijkstra算法堆优化,Vector建图】 最短路 Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 55757    Accepted Submission(s): 24651 Problem Description 在每年的校赛里,所有进入决赛的同学都会获 阅读详情

小明的爸爸突然想抽烟,于是派小明去买烟。现在小明想要寻找最短的从商店到家的路线,你可以帮助他吗?
Input

输入包括多组数据。每组数据第一行是两个整数N、M(N<=100,M<=10000),N表示有几个路口,标号为1的路口是商店所在地,标号为N的路口是家所在地,M则表示有几条路。N=M=0表示输入结束。接下来M行,每行包括3个整数A,B,C(1<=A,B<=N,1<=C<=1000),表示在路口A与路口B之间有一条路,小明需要C分钟的时间走过这条路。
输入保证至少存在1条商店到家的路线。

 对于每组输入,输出一行,表示小明从商店走到家的最短时间

Output 

2 1
1 2 3
3 3
1 2 5
2 3 5
3 1 2
0 0

Sample Output 

3
2

 

裸的最短问题,dijkstra和Floyd都可以做,这里N 的范围比较小,但是如果N非常大但是M很小的话,dijkstra的邻接矩阵存储图会爆内存,下面用邻接表来实现存图

这里用vector来实现邻接表的操作

#include<iostream>
#include<vector>
#include<algorithm>
#include<cstring>
#include<string>
#include<cstdio>
#include<cstdlib>
#define N 110
#define INF 0x3f3f3f3f
using namespace std;
 
int n,m,a,b,c,vis[N],dis[N],Min;
 
struct node
{
    int d,w;
};//定义一个结构体来存储每个入度点以及对应边的权值
//比如边u->v,权值为w,node结构体存储的就是v以及w。
 
vector<node>v[N];
 
void dijkstra();
 
int main()
{
    //对于N非常大但是M很小的这种稀疏图来说,用邻接矩阵N*N是存不下的。邻接矩阵是将所有的点都存储下来了,然而
    //对于稀疏图来说,有很多点是没有用到的,把这些点也存储下来的话就会很浪费空间。可以用邻接表来存储,这里借助vector来实现邻接表的操作。
    //用邻接表存储时候,只存储有用的点,对于没有用的点不存储,实现空间的优化。
    while(cin>>n>>m,n!=0||m!=0)
    {
        for(int i=0; i<=n; i++)
            v[i].clear();//将vecort数组清空
        for(int i=1; i<=m; i++) //用vector存储邻接表
        {
            node nd;
            scanf("%d%d%d",&a,&b,&c);
            nd.d=b,nd.w=c;//将入度的点和权值赋值给结构体
            v[a].push_back(nd);//将每一个从a出发能直接到达的点都压到下标为a的vector数组中,以后遍历从a能到达的点就可以直接遍历v[a]
            nd.d=a,nd.w=c;//无向图的双向存边
            v[b].push_back(nd);
        }
        dijkstra();
        printf("%d\n",dis[n]);
    }
    return 0;
}
 
void dijkstra()
{
    //初始位置从顶点1开始。
    memset(vis,0,sizeof(vis));//初始化标记数组
    for(int i=0; i<=n; i++)
        dis[i]=INF;//先将dis初始化为无穷大,下面更新dis的初始值。
    int len=v[1].size();//找到从起始位置能到达的点有几个,v[1]的大小就是能到达的点的个数
    for(int i=0; i<len; i++) //循环遍历每个点然后更新dis初始值
    {
        if(dis[v[1][i].d]>v[1][i].w)//v[1][i].d代表从1出发能到达的顶点中第i个点的值,
            //dis数组记录从1出发到该顶点的距离,v[1][i].w代表从1出发能到达的顶点中,到达第i个顶点的边的权值
            dis[v[1][i].d]=v[1][i].w;//更新dis数组,这里更新的时候包括了对重边的更新
    }
    vis[1]=1;
    int k;
    for(int i=1; i<n; i++)
    {
        Min=INF;
        for(int j=1; j<=n; j++) //dijkstra找最近的点
        {
            if(vis[j]==0&&dis[j]<Min)
            {
                Min=dis[j];
                k=j;
            }
        }
        vis[k]=1;//k为找到的点
        len=v[k].size();//从k出发能到达的点的个数
        for(int j=0; j<len; j++) //循环遍历k能到达的点(假设为vi),比较从源点到达q的距离,和从源点出发借助k这个点中转再到达q的距离,然后更新dis数组
        {
            int vi=v[k][j].d;//v[k][j].d代表从k出发能到达的顶点中第j个顶点的值
            if(vis[vi]==0&&dis[vi]>dis[k]+v[k][j].w)//借助k这个点能进行松弛操作的话,更新
                dis[vi]=dis[k]+v[k][j].w;
        }
    }
}
 

堆优化

#include<iostream>
#include<algorithm>
#include<string.h>
#include<stdio.h>
#include<queue>
#include <vector>
#include <map>
int s,t;
int n,m;
using namespace std;
const int INF=99999999;
struct Node{
    int to;
    int w;
};
struct Node temp;
vector<Node> v[1002];
typedef pair<int, int> P;
int dis[1002];

void Dijkstra(){
    for(int i=1;i<=n;i++)
        dis[i]=INF;
    priority_queue<P,vector<P>,greater<P> >que;
    que.push(P(0,1));
    dis[1]=0;
    while(!que.empty()){
        P p=que.top();que.pop();
        if(dis[p.second]<p.first)
            continue;
        for(int i=0;i<v[p.second].size();i++){
            if(dis[v[p.second][i].to]>dis[p.second]+v[p.second][i].w){
                dis[v[p.second][i].to]=dis[p.second]+v[p.second][i].w;
                que.push(P(dis[v[p.second][i].to],v[p.second][i].to));
            }
        }
    }
}

int main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++)
        v[i].clear();
    for(int i=1;i<=m;i++){
            cin>>s>>temp.to>>temp.w;
            v[s].push_back(temp);
    }
    Dijkstra();
    cout<<dis[6];
    return 0;
}

 

C++单源点最短路——dijkstra的堆优化模板(包看包懂) 众所周知,最短路是图论问题里最重要的问题,本文将详细探索最短路算法的dijkstra算法的堆优化。初学者必看的博客。 阅读详情

相关推荐

Dijkstra与最短路算法:竞赛与应用全解析

最短路算法是图论中的核心问题,用于在带权图中寻找顶点间的最短路径。Dijkstra算法基于贪心策略,通过逐步扩展已知最短路径的顶点集合来求解单源最短路,其堆优化版本时间复杂度为O(mlogn),适合处理稀疏图。Bellman-Ford和SPFA算法能处理含负权边的图,而Floyd算法则以O(n³)的时间复杂度解决全源最短路问题。这些算法在编程竞赛和工程实践中都有广泛应用,如交通规划、网络路由等场景。掌握不同算法的适用场景和优化技巧,对于解决实际问题至关重要。

weixin_30512089的博客 437

C++STL中不定长数组vector的底层实现和常用操作

作用: vector容器不但能像数组一样对元素进行随机访问,还能在尾部插入元素,是一种简单,高效的容器,完全可以代替数组,vector具有自动管理功能,对于元素的插入和删除,可动态调整所占的内存空间。 vector模版类需要两个模版参数,第一个参数是存储元素的数据类型,第二个参数是存储分配器的类型,其中第二个参数是可选的,如果不给出第二个参数,将使用默认的分配器。 使用要加头文件<vector>。 vector常用函数 定义: vector<类型> 变量名称。 如 .

马小超 1849

基于vector的邻接表解决最短路稀疏图的问题

在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt。但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线,你可以帮助他们吗? Input 输入包括多组数据。每组数据第一行是两个整数N、M(N<=100,M<=10000),N表示成都的大街上有几个路口,标号为1的路口是商店所在地,标号为N的路口是赛

Hard。 745

Dijkstra+vector实现邻接表+优化(相邻村val=0并连接)(2021-8-6)

一个人的旅行 题意: 草儿决定在要在最短的时间去一个自己想去的地方!因为草儿的家在一个小镇上,没有火车经过,所以她只能去邻近的城市坐火车。 输入: 输入数据有多组,每组的第一行是三个整数T,S和D,表示有T条路,和草儿家相邻的城市的有S个,草儿想去的地方有D个; 接着有T行,每行有三个整数a,b,time,表示a,b城市之间的车程是time小时;(1=<(a,b)<=1000;a,b 之间可能有多条路) 接着的第T+1行有S个数,表示和草儿家相连的城市; 接着的第T+2行有D个数,表示草儿想去地

hh的博客 632

AI 编程新范式:一文彻底搞懂 LLM、Agent、MCP、Skill 是怎么协作的

本文用通俗易懂的方式解析了AI编程新架构的核心概念。通过"三国演义"类比,文章将复杂的技术架构拆解为:Agent(军师/大脑)负责思考和决策,Skill(招式/手脚)执行具体操作,MCP(令箭/协议)作为通信标准,MCP Server(将军/身体)承载多个Skill。这套分工架构使AI从单纯聊天进化成能完成实际编程任务的全能助手,实现了关注点分离——Agent专注智能提升,Skill专注功能实现,MCP确保稳定连接。这正是Cursor、Claude等新一代AI开发工具采用的核心架构,标志

猫老板的豆 3080

一文入门Qwen-Agent【附实战代码】

Qwen-Agent 是一个开源框架,用于开发基于 Qwen 模型的 AI 智能体应用,一文带你入门使用

m0_55303420的博客 1875

最短路vector建图多种方式实现最短路+toposort

吐槽: 不停的学习对于理解是有好处的,刚学会链式前向星的时候,觉得前向星好方便呀,现在会了用vector后就不想去用前向星建图了,感觉有点麻烦,不过理解了前向星,能更好的理解vector的用法 既然现在用vector建图,那必然要学会最短路的vector使用方法(堆优化) ...

yangzijiangac的博客 837

预处理详解(三)—— 命令行定义 + 条件编译 + 文件包含

文章目录前言 前言

2021dragon的博客 2187

Dijkstra求解最短路(堆优化) C++

使用stl优先队列实现小根堆。

zyang654321的博客 209

c#【保姆级教程】基于System.Text.Json 支持多态类型序列化! 手把手教你实现一个通用的 PolymorphicJsonConverter!

我们需要自己实现一个继承自的转换器,在序列化时记录具体类型,在反序列化时根据类型标识还原成正确的子类对象。public abstract class WorkStepBase { /* 抽象方法等 */ }public class Person : WorkStepBase { /* 实现 */ }public class Product : WorkStepBase { /* 实现 */ }特性说明✅ 自动发现子类无需手动维护类型列表,自动扫描程序集✅ 类名映射。

一个编程的同学 425

黑猫带你学Nand第11篇:万字长文带你了解NandFlash的数据保持原理及特性(Data Retention)

TATTAT:Trap-assistedtunneling,陷阱辅助隧穿,也有叫法称为电荷陷阱现象。这是一种物理现象,它发生在非挥发性存储器,如NAND闪存。在这种效应中,存储在闪存单元浮动栅极上的电荷(电子)由于隧道氧化物中捕获的电荷形成的电场影响,导致电荷通过隧道效应从一个能级隧穿到另一个能级,从而造成电荷泄漏。这种电荷泄漏是导致闪存数据保持问题的主要原因之一,因为它可以改变存储在闪存单元中的电荷量,进而改变其阈值电压水平,最终可能导致数据错误。在NANDFlash中,电荷被存储在浮置栅极上。

黑猫奥利奥的博客 1097

C++的vector、list、map和unordered_map

C++的vector、list、map和unordered_map vector: 是向量类型,可以容纳许多类型的数据,因此也被称为容器。相当于一个数组,在内存中分配一块连续的内存空间进行存储,可以不指定vector的大小。STL内部实现时,首先分配一个非常大的内存空间预备进行存储,若超过此分配的空间时再整体重新分配一块内存存储。(头文件#include) //定义长度为10整型元素的向量 ...

weixin_42186644的博客 1400

麻辣香锅病毒分析

Spicy Hot Pot浏览器劫持病毒(麻辣香锅病毒)从2020年初被安全公司监测到,因其病毒模块带有MLXG_KM被安全行业代称麻辣香锅病毒。目前通过各种激活工具传播, 包括暴风激活、小马激活和KMS激活等诸多工具,疑似与下载站进行合作推广此类激活工具。Spicy Hot Pot 是一个浏览器劫持 Rootkit,它会将用户的主页更改为指向恶意软件操作员控制的页面,此外还会将内存转储从机器上传到预定义的服务器,并结合本地更新功能以确保其保持更新。通常浏览器劫持者会通过更改用户主页的恶意可执行文件或注册表

不忘初心,护天下安全! 4788

专题 | 存图&最短路&负环

图的存储方式Dijkstra堆优化Dijkstra求总路径条数不多于K条的最短路径SPFA堆优化Dijkstra和SPFA的区别和优缺点SPFA判负环Floyd弗洛伊德Johnson 全源最短路次短路算法/K短路算法其他算法。

hzx616599的博客 1084

2024 大型集团人力资源数字化转型业务蓝图规划及实施路径规划方案【附全文阅读】

摘要:本方案针对大型企业人力资源数字化转型需求,重点解决组织协同弱、薪酬绩效管控难等痛点。通过构建"6项能力+8大流程+4大系统"框架,分三阶段(2024-2026年)实施7大项目,包括e-HR系统更换、员工服务平台搭建等核心场景。方案优先推进基础系统改造(2024年),再完善绩效管理和数据分析(2025年),最后落地人才发展等进阶模块(2026年),实现与OA、ERP系统的数据集成,全面提升HR运营效率和员工体验。文末提供的优先级清单明确了10个数字化场景的实施顺序及预期价值。

cdfunlove的博客 1346

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

dijkstra 加上堆优化及两种存储图的方法

好久没写博客了,最近忙于期末考试复习,所以更的就少了,今天总结一下最短路Dijkstra算法的堆优化的思想及代码,加上几种存图的方法临接表和vector加上pair<int,int>,都是从别人那里学来的,嘿嘿,大佬别喷啊。 首先附上vector的代码: #include <iostream> #include <bits/stdc++.h> using nam...

weixin_43323647的博客 713

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

dijkstra vector存图,堆优化模板hdu2544

题意:给一个图,求1到n的最短路。 思路:直接写dijkstra,数据量小,其实不用堆优化也行。 用优先队列保存结点,按照距离从小到大排序,可以快速的求出离1距离最小的点。 #pragma warning(disable:4996) #include<iostream> #include<cstring> #include<cstdio> #includ...

sunnyorrainy的博客 441

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

从存图到最短路算法的图论总结

INTRODUCTION: 图论算法在计算机科学中扮演着很重要的角色,它提供了对很多问题都有效的一种简单而系统的建模方式。很多问题都可以转化为图论问题,然后用图论的基本算法加以解决。--百度百科 对于OI而言,图是指由若干给定的点及若干条连接两点的线(边)所构成的图形 借助图论知识,我们往往可以将一些复杂的问题转化到基础的图论算法上,进而使用已有算法解决全新问题 那么想如果想要运...

weixin_30457065的博客 224

C++图论基础单源最短路经典OJ题流食般投喂

💡这题的难点是动态规划的填表顺序,基于单源最短路的填表顺序,该题动态规划状态转移方程的更新是跟着松弛操作的判断同步的。dist[a] + 1 < dist[b] 的条件是第一次遍历到 b 点,而且 a 点已经确定了,dist[a] 的确定意味着 f[a] 的确定,f[b] = f[a];这里还用了一个做题技巧,就是存反图,这里是从起点走到 i 位置,再从 i 位置走回到起点位置,然后在开始其他趟的进行,这里我们如果不建反图的话,解决从 i 位置走到起点位置是比较麻烦的,如果我们。以 n 为起点走到 1 .

江屿风的博客 1440

回顾图存储与最短路算法

图的存储与最短路问题 一、图的储存 1.邻接矩阵 邻接矩阵使用二维 vectorvectorvector 存储数据 d[i][j]d[i][j]d[i][j] 表示从点 iii 到点 jjj 的权值 有向图存储一个即可,无向图还需要存储 d[j][i]d[j][i]d[j][i] 优点: 1.表示方式直接,直观易于理解 2.在稀疏图上节省空间 缺点: 1.二维 vector 在访问时会比较耗时 总结:邻接矩阵所以只适合处理 ∣N∣<=2500|N|<= 2500∣N∣

weixin_54990292的博客 2152

GZHU - 1549 骑宝马 (dijkstra+优先队列+vector存图)

Semon刚买了一辆宝马。他想把这个好消息告诉给他的好朋友GirlGod。Semon的家在编号为start的点上,而GirlGod的家在编号为end的点上。他的宝马可以稳定以1米每秒的速度从start到达end。而广州的路比较诡异,可以离散化为n个点(编号为1到n)和m条路。这m条路的两个端点一定是编号不同的两个的点。他的宝马没有导航,他很想知道从start到达end最少需要多少秒。你知道了m条路...

洛 水 251

堆优化Dijkstra算法详解:从原理到实战解决单源最短路径问题

单源最短路径是图论中的核心基础问题,旨在寻找从给定起点到图中所有其他顶点的最短距离。其经典解法Dijkstra算法基于贪心策略,通过不断松弛边来逐步确定最短路径。然而,面对大规模图(如社交网络、交通路网或路由拓扑),朴素Dijkstra的O(N²)时间复杂度成为性能瓶颈。为此,引入优先队列(堆)进行优化,将复杂度降至O((V+E)log V),这是处理海量节点与边的关键技术。堆优化Dijkstra不仅大幅提升了计算效率,还通过“懒惰删除”机制避免了无效操作,是算法竞赛和工程实践的必备技能。在实际应用中,该算

weixin_33788244的博客 434

spfa(求单源最短路)

一、简介 spfa :Shortest Path Faster Algorithm 单源最短路:给定一个带权值的有向图,给定图中的一个定点V,则V称为源,V能到达所有的顶点的最短距离称为单源最短路 二、图的存储方式 #include<bits/stdc++.h> #define inf 0x3f3f3f3f #define M 500005 using namesp...

卑鄙的我 461

hdu5521 Meeting 虚点建图+dij+堆优化

http://acm.hdu.edu.cn/showproblem.php?pid=5521 题意:就是问你从1和n两个地方出发,在那个点见面时间最短,若有时间相等的点 按升序输出点 存图难,算法就是dij。存图看了大佬的博客,意思是说如果直接存图 会存n*n的边 笋干爆炸,因为是集合这种,所以直接每个集合建立一个虚点,再把集合里的点连起来,相应的集合点连虚点边为给定权值,而虚点连集合点为0即...

gml1999的博客 335

HDU 3790 dij+堆优化(领接表版本和vector版本)

求最短路的同事求最小花费 板子题 练习下堆优化的dijstr dij+邻接表 #include<cstdio> #include<cstring> #include<string.h> #include<algorithm> #include<iostream> #include<stdlib.h> #inclu...

gml1999的博客 282
上一篇: 拓扑排序三种方法
下一篇: HDU——1166 敌兵布阵(线段树点更新+区间查询)
donCoder
博客等级 码龄9年 65粉丝 79原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值