单源最短路,迪杰斯特拉算法

ICC2:mem出pin的Off Grid问题 这个命令本意是解决跨制成调用IP时在IP出pin位置加一定的routing blockage,限制绕线在一定范围内只能走直线出pin,用来解决off-grid问题也有很好的效果。在ICC2做先进工艺时会有off-grid的问题,off-grid可以理解为绕线没有在preferred方向track上。测试发现,2022版本以前的ICC2绕线容易有off-grid问题。主要在mem出pin的M2/M3层次上,切换版本绕线能很大程度上解决这个问题。我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧? 阅读详情

一个包含n个结点的图,求其他点到源点s的最短距离。
设d[i]表示结点i到s的最短路径的长度,显然有d[s]=0;
设vis[i]表示i是否在集合S中,集合S中存放的是已经求得的最短路径的结点。
算法步骤:
首先在V-S集合中找到最小的d的下标k,然后将k加入到集合S中(令vis[k]=true),然后更新d值即可(令d[i]=min(d[i],d[k]+w[k][i]),其中w[k][i]表示边k-i的权值)
复杂度O(n^2)

#include<bits/stdc++.h>
using namespace std;
const int maxn=100;
const int inf=0x3f3f3f3f;

int n;
int d[maxn+5];
bool vis[maxn+5];
int w[maxn+5][maxn+5];

int find(){//在V-S中找到最小的d
    int mind=inf;
    int mini=-1;
    for(int i=1;i<=n;i++)if(vis[i]==false&&d[i]<mind){
        mind=d[i],mini=i;
    }
    return mini;
}

void update(int cur){//更新V-S中的d
    for(int i=1;i<=n;i++)if(vis[i]==false){
        d[i]=min(d[i],d[cur]+w[cur][i]);
    }
}

void dijkstra(int cur){//求其他点到源点的最短路
    memset(vis,false,sizeof(vis));
    memset(d,inf,sizeof(d)),d[cur]=0;//s到s距离为0,其他到s为inf
    while((cur=find())!=-1){//如果所有点都被访问则退出,如果图连通则循环n-1次
        vis[cur]=true;
        update(cur);
    }
}

int main(){
    memset(w,inf,sizeof(w));
    int m;
    cin>>n>>m;//n个点m条边
    while(m--){
        int x,y,z;
        cin>>x>>y>>z;//点x到y的边长为z
        w[y][x]=w[x][y]=z;//无向图
    }
    dijkstra(1);
    for(int i=1;i<=n;i++){//输出其他点到源点的最短路长度
        cout<<i<<ends<<d[i]<<endl;
    }
}

如果要打印出其他点到源点s的最短路径,可以采用记录父结点的方法,设结点i的父结点为per[i](令per[s]=-1),然后将update函数稍微修改一下:

void update(int cur){//更新V-S中的d
    for(int i=1;i<=n;i++)if(vis[i]==false&&d[cur]+w[cur][i]<d[i]){
        d[i]=d[cur]+w[cur][i];
        per[i]=cur;
    }
}

用优先队列“优化”到O(mlogn),m是边的条数,如果m与n^2同阶就比O(n^2)要慢了,不过很多情况都是m比n^2小。
这里和上面一种方法有两点不同:

  1. 查找最小d的下标用了优先队列。
  2. 更新d的时候,只会更新和cur相邻的点(cur就是最小d的下标)。
#include<bits/stdc++.h>
using namespace std;
const int maxn=1000;
const int inf=0x3f3f3f3f;
typedef pair<int,int> PAIR;//first为d,second为其下标

vector<int>nxt[maxn+5];
int n;
int d[maxn+5];
bool vis[maxn+5];
int w[maxn+5][maxn+5];

priority_queue<PAIR,vector<PAIR>,greater<PAIR> >pq;

void update(int cur){//更新与cur相邻的未访问的点的d
    for(int i=0;i<nxt[cur].size();i++){
        int x=nxt[cur][i];
        if(vis[x]==false){
            d[x]=min(d[x],d[cur]+w[cur][x]);
            pq.push(make_pair(d[x],x));//将更新后的d连同下标放入优先队列
        }
    }
}

void dijkstra(int cur){
    memset(vis,false,sizeof(vis));
    memset(d,inf,sizeof(d)),d[cur]=0;
    while(!pq.empty())pq.pop();

    pq.push(make_pair(d[cur],cur));
    while(!pq.empty()){
        cur=pq.top().second;//最小的d的下标
        pq.pop();
        if(vis[cur])continue;
        vis[cur]=true;
        update(cur);
    }
}

int main(){
    int m;
    cin>>n>>m;
    while(m--){
        int x,y,z;
        cin>>x>>y>>z;
        w[x][y]=w[y][x]=z;
        nxt[x].push_back(y);
        nxt[y].push_back(x);
    }
    dijkstra(1);
    for(int i=1;i<=n;i++){
        cout<<i<<ends<<d[i]<<endl;
    }
}
【大模型工程局】告别单打独斗:手把手带你构建多智能体系统(MetaGPT 启示录) 想象一下,不再是只有一个全知全能的 AI,而是有一群各有所长、能够独立思考和行动的“智能体”(Agent)。它们生活在一个共同的环境中,可以相互交流、协作完成共同目标,也可能为了有限资源而相互竞争。这就是多智能体系统(MAS)的核心图景。MAS 的关键特征:自治性 (Autonomy):每个智能体都能独立感知环境、做出决策并执行动作,无需外部直接控制。交互性 (Interaction):智能体之间可以通过某种通信机制(显式或隐式)交换信息、协调行为。 阅读详情

相关推荐

关于token无痛刷新的两个方案

目录方案一方案二 方案一 思路: 后端需要返回一个token过期的时间,在请求发起前拦截每个请求,判断token的有效时间是否已经过期,如果已过期,则暂时将请求挂起,先刷新token后再继续请求。 前期思考: 返回过期时间是为了判断是否过期的,但是如果服务器时间和系统时间不一致呢? 如果同时发起多个请求时怎么办? 实现: 因为是在请求前进行拦截,所以这里用axios的axios.interceptors.request.use()方法 首先,关于服务器时间和系统时间不一致的问题,我的解决方法是:

Yugoup的博客 2716

最短路之单源最短路

在学习图论的过程中,最短论问题是比较常见且又具有代表性的一类问题。最短路是给定两个定点,在以这两个点作为起点和终点的路径中,边的权值和最小的路径。在实际生活中,最常见的最短路问题,就是在地图导航上应用。比如我们把权值作为距离,那么我们就可以求得A到B的最短路径。如果时间作为权值,那么我们就可以得到A到B的最短时间。 1、Bellman-Ford算法          单源最短路问题就是将起点固

Enstein_Jun 5185

从零开始之stm32之CAN通信

CAN通信极简教程(小白友好版),从小白的视角了解并实现简单的STM32F103的CAN通信,直接上手。

qq_30993593的博客 1306

最短路(hdu1874)Floyd算法

Problem Description 某省自从实行了很多年的畅通工程计划后,终于修建了很多路。不过路多了也不好,每次要从一个城镇到另一个城镇时,都有许多种道路方案可以选择,而某些方案要比另一些方案行走的距离要短很多。这让行人很困扰。 现在,已知起点和终点,请你计算出要从起点到终点,最短需要行走多少距离。  Input 本题目包含多组数据,请处理到文件结束。 每组数据第一行包

至少努力过 700

DSSAT模型建模教程

随着数字农业和智慧农业的发展,基于过程的作物生长模型(Process-based Crop Growth Simulation Model)在模拟作物对气候变化的响应与适应、农田管理优化、作物品种和株型筛选、农业碳中和、农田固碳减排等领域扮演着越来越重要的作用。现有版本V4.7能模拟27种主要农作物的生长发育和产量形成过程,被广泛应用于精细农业、水肥管理、气候变化、粮食安全、土壤碳周转、环境影响、农业可持续性、农业生态等诸多与农业生产和科研有关的领域。如果你是个模型入门者,这次将让你体验一键模拟的乐趣。

weixin_55561616的博客 1414

SAP数据导入工具(LSMW) 超级详细教程(批量导入内部订单)

用户提了个需求,让我批量导入内部订单几百个内部订单。我本打算用写段ABAP 代码来调用 BAPI (BAPI_INTERNALORDER_CREATE)就可以了。但想到我很久没有用过LSMW 了,都快要忘记了。于是我采用LSMW的方式,完成了任务。并把过程记录下来,形成教程方便我以后回头查看,分享出来也希望对大家有帮助。

IT小职员 2万+

单源最短路(dijikstra算法)

单源最短路(dijikstra算法) 百度百科定义中:给定一个带权有向图G=(V,E),其中每条边的权是一个实数。另外,还给定V中的一个顶点,称为源。现在要计算从源到其他所有各顶点的最短路径长度。这里的长度就是指路上各边权之和。这个问题通常称为单源最短路径 问题。 dijikstra算法是一种图算法,其中有用到BFS的思想。他和最小生成树有相同之处,但实际解决的是不同的问题。 我们还是先看...

weixin_43859149的博客 1230

记一次完整的RPG Maker MV游戏逆向过程(思路一)

了解RPG Maker MV的文件建构 上一篇文章,我们已经成功在PC上运行了游戏,那我们如何对游戏进行逆向呢? 首先要了解正常的RPG Maker MV制作的游戏应该具有哪些文件,以及他的结构 那如何了解他的结构呢,很简单,我们只需要用RPG Maker MV创建一个默认工程,来看看一个游戏的最简结构是怎么样的 创建新项目 项目创建完成 查看项目目录结构 是不是和之前解包出来的很像呢? 通...

Ciiiiiing的博客 1万+

图论(五)单源最短路算法

目录一 单源最短路问题二 有向无环图的单源最短路算法三 Dijkstra算法3.1 原理3.2 伪代码与代码实现3.3 时间复杂度分析3.4 正确性证明3.5 与BFS和Prim算法的比较四 Bellman-Ford算法4.1 无负圈的最短路算法4.2 正确性分析4.3 检测负圈4.4 完整的Bellman-Ford算法 一 单源最短路问题 给出单源最短路的定义:给定一个有向图G=(V,E),每条边都有一个权重wiw_iwi​,在现实问题中,权重可以代表长度、时间、成本、罚款损失…,我们可以简单的理解为长

qq_45785407的博客 1802

Mac用户必看:Typora最新版永久激活+弹窗屏蔽保姆级教程(附崩溃解决方案)

本文为Mac用户提供了一份详尽的Typora最新版永久激活与弹窗屏蔽教程。通过修改关键JS文件,实现软件激活状态并彻底关闭成功提示弹窗。文章深入剖析了操作原理,并重点提供了解决由此引发的多文档崩溃问题的实用临时方案,同时客观讨论了该方法的局限性与潜在风险。

wine的专栏 2364

Windows Server安装Intel I219-V网卡驱动完整教程

在Windows Server系统上安装Intel I219-V网卡驱动的方法。

小白成长历程 5177

单源最短路算法总结(拓扑、dijkstra、Floyd、Bellman-ford、SPFA) 以洛谷P1807 最长路为例

拓扑、dijkstra、Floyd、Bellman-ford、SPFA、SPFA栈优化、堆优化、SLF优化、LLL优化、SLF + LLL优化

xxcdsg的博客 1510

ICT模拟零件测试方法--电容测试

通常,小到 100 pF 的电容需要补偿,因为夹具和系统的电容(20 到 50 pF)相对于被测设备的值是显著的。软件在需要补偿的电容测试中加入 comp 选项,而在不需要补偿的电容测试中加入 nocomp 选项。在调试期间,通过向电容语句添加 pc 选项验证您的电容测试。在测试单独的电容时,从测量结果中减去学到的值,然后与测试限制进行比较以决定通过或失败。请注意,如果用于需要补偿的电容测试上的感应总线使用了单独的探针,测量将无效。在测试电容时,应注意两个方面:电容的电阻元件,以及夹具和系统本身的电容。

可可南木的博客 1218

【算法】单源最短路-迪杰斯特拉算法

Dijkstra算法是一种基于贪心策略的单源最短路径算法,适用于有向图。其核心思想是:当前节点的最短路径依赖于前一节点的最短路径。算法通过维护距离数组和优先队列(最小堆)实现,步骤如下:初始化距离数组,将起点加入优先队列;每次取出最小成本节点,更新其邻接节点的距离;重复直到所有节点被处理。文章以LeetCode 3650题为例,展示了如何通过邻接表存储图(包括反向边),使用优先队列优化Dijkstra实现最短路径计算。关键点包括:邻接表结构设计、优先队列排序规则、以及提前终止条件(到达终点时直接返回)。

qq_39166045的博客 1126

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

简要整理有权单源最短路-Dijkstra(迪杰斯特拉)算法

Dijkstra(迪杰斯特拉)算法

moge的博客 949

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

LeetCode 1334. 阈值距离内邻居最少的城市:多次运用单源最短路的迪杰斯特拉算法

LeetCode 1334. 阈值距离内邻居最少的城市:多次运用单源最短路的迪杰斯特拉算法 有 n 个城市,按从 0 到 n-1 编号。给你一个边数组 edges,其中 edges[i] = [fromi, toi, weighti] 代表 fromi 和 toi 两个城市之间的双向加权边,距离阈值是一个整数 distanceThreshold。 返回能通过某些路径到达其他城市数目最少、且路径距离 最大 为 distanceThreshold 的城市。如果有多个这样的城市,则返回编号最大的城市。 注意,

<font color="Pink">Tisfy的博客</font> 528

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

迪杰斯特拉算法实现-Dijkstra 简单版

迪杰斯特拉算法实现单源最短路 使用了 邻接表来存放图的信息,使用了优先级队列。 #include <iostream> #include<queue> #include<vector> #include<cstdio> #include<cstring> #include<algorithm> using namesp...

ding_programmer的博客 1171

迪杰斯特拉算法求单源最短路(最基础)

#include<bits/stdc++.h> using namespace std; //迪杰斯特拉算法求单源最短路 const int MAXV=1000; const int INF=0x3fffffff; int n,m,s,G[MAXV][MAXV];//顶点数,边数,起点,图 int d[MAXV]; bool vis[MAXV]={false}; void Dijkstra(int s){ fill(d,d+MAXV,INF); d[s]=0;//起点设为0 .

Dwyanesyl的博客 208

迪杰斯特拉算法求单源最短路

http://acm.hdu.edu.cn/showproblem.php?pid=2112 经过锦囊相助,海东集团终于度过了危机,从此,HDU的发展就一直顺风顺水,到了2050年,集团已经相当规模了,据说进入了钱江肉丝经济开发区500强。这时候,XHD夫妇也退居了二线,并在风景秀美的诸暨市浬浦镇陶姚村买了个房子,开始安度晚年了。 这样住了一段时间,徐总对当地的交通还是不太了解。有时很郁闷,...

小糊涂的博客 241

单源最短路奇技淫巧之迪杰斯特拉算法(Dijkstra)

单源最短路之迪杰斯特拉算法(Dijkstra) 问题定义: 求解单源点的最短路径问题:给定带权有向图G和源点s,求点s到图G中其他点的最短路径 可以采用迪杰斯特拉算法(Dijkstra),或者SPFA算法,这里我先介绍一下第一种Dijksta算法 核心思想: 其核心思想就是贪心o(︶︿︶)o(我怎么感觉好多算法基本上不是大暴力就是大贪心) 1、指定一个节点,例如我们要计算 ‘A’ 到其他节点的最短路径 2、引入两个集合(S、U),S集合包含已求出的最短路径的点(以及相应的最短长度),U集合包含未求出最短路

Suryxin's blogs 783

单源最短路之dijkstra

迪杰斯特拉算法主要用于解决单源最短路问题,主要有两种,朴素版和堆优化版,数据量较大时用堆优化版。以下是三道pintia上三道朴素版迪杰斯特拉的题目:1.L2-001 紧急救援作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图。在地图上显示有多个分散的城市和一些连接城市的快速道路。每个城市的救援队数量和每一条连接两个城市的快速道路长度都标在地图上。当其他城市有紧急求助电话给你的时候,你的任务是带领你的救援队尽快赶往事发地,同时,一路上召集尽可能多的救援队。

Kyrieeeeeeeee的博客 860

求单源最短路(Dijkstra 算法-迪杰斯特拉算法,SPFA)

特性Dijkstra (优先队列版)SPFA核心思想贪心Bellman-Ford 的队列优化数据结构优先队列 (Min-Heap)普通队列 (Queue)处理负权边不能可以检测负权环不能可以时间复杂度 (最坏)OElog⁡VOElogV(稳定)OV⋅EOV⋅E(不稳定)时间复杂度 (平均)OElog⁡VOElogVOkEO(kE)OkE(通常更快)适用场景无负权边的图,求单源最短路径。这是最主流的场景。

ltrbless的博客 1139

数据结构与算法-图论-复习1(单源最短路,全源最短路,最小生成树)

以 “拯救大兵瑞恩” 为例,使用三维数组 d[x][y][st] 记录状态,其中 (x,y) 表示节点坐标,st 表示当前拥有的钥匙状态,只有拿到了钥匙才能进入到对应层的一些状态,在 BFS 或 Dijkstra 过程中更新状态。以 “可以免费建立 k 条边,求最小的花费” 为例,二分答案 mid,将边权大于 mid 的边视为 1,边权小于等于 mid 的边视为 0,使用双端队列 BFS 求解最短路,判断最短路径上大于 mid 的边数是否小于等于 k。对于边权为 1 的边,将其终点插入队尾。

2401_84910613的博客 1212

单源最短路迪杰斯特拉算法

#include <iostream> #include <cstring> #include <queue> using namespace std; static const int N = 1005; static const int M = 5010; static const int inf = 0x3f3f3f3f; struct edge { ...

还有头发还能学的博客 274

数据结构与算法-图论-最短路-单源最短路的建图方式

它基于贪心策略,从起始城镇(T_s)(源点)出发,不断选择距离源点最近的未确定顶点,更新其邻接顶点的距离,逐步确定到其他所有顶点的最短距离,最终得到到终点城镇(T_e)的最短路径和最小总费用。2. 转换问题:为了让(B)收到(100)元,设(A)转出的金额为(x)元,那么经过一系列转账路径后,最终到达(B)的金额为(x)扣除所有手续费后的剩余金额,要使其等于(100)元。首先将源点加入队列,然后不断取出队首顶点,对其邻接顶点进行松弛操作,如果某个邻接顶点的距离值被更新,且该顶点不在队列中,则将其加入队列。

2401_84910613的博客 1578

代码随想录算法训练营第六十天|SPFA、bellman_ford之判断负权回路、bellman_ford之单源有限最短路

minDist记录起点到该节点的最短路径。从起点出发,每次选取一个到起点最近的(minDist最小的)节点,更新这个节点指向的所有节点的minDist数组值,然后每次选minDist值最小的,重复上述过程,直到重复了n遍(n为节点的数量)。不能用于边权有负数的情况。

2302_80777118的博客 906
上一篇: Miller-Rabin素数判定O((logn)^2)
下一篇: 输入输出流
FightingForFinal
博客等级 码龄11年 24粉丝 100原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值