HDU2544 最短路dij

article/2025/8/30 9:33:46

纯最短路。

  1 ///HDU 2544堆优化的最短路
  2 #include <cstdio>
  3 #include <iostream>
  4 #include <sstream>
  5 #include <cmath>
  6 #include <cstring>
  7 #include <cstdlib>
  8 #include <string>
  9 #include <vector>
 10 #include <map>
 11 #include <set>
 12 #include <queue>
 13 #include <stack>
 14 #include <algorithm>
 15 using namespace std;
 16 #define ll long long
 17 #define _cle(m, a) memset(m, a, sizeof(m))
 18 #define repu(i, a, b) for(int i = a; i < b; i++)
 19 #define repd(i, a, b) for(int i = b; i >= a; i--)
 20 #define sfi(n) scanf("%d", &n)
 21 #define pfi(n) printf("%d\n", n)
 22 const int MAXN = 2200;
 23 const int MAXM = 20200;
 24 const int INF=0x3f3f3f3f;
 25 struct Node
 26 {
 27     int to,next,w;
 28 } edge[MAXM];
 29 struct HeapNode
 30 {
 31     int d, u;
 32     bool operator < (const HeapNode& rhs) const
 33     {
 34         return d > rhs.d;
 35     }
 36 };
 37 struct Dijkstra
 38 {
 39     int head[MAXN],d[MAXN];
 40     bool done[MAXN];
 41     int cnt;
 42     void init()
 43     {
 44         memset(head,-1,sizeof(head));
 45         cnt = 0;
 46     }
 47     void AddEdge(int u, int v, int w)
 48     {
 49         edge[cnt].to=v,edge[cnt].next=head[u];
 50         edge[cnt].w=w,head[u]=cnt++;
 51         edge[cnt].to=u,edge[cnt].next=head[v];
 52         edge[cnt].w=w,head[v]=cnt++;
 53     }
 54     void dijkstra(int s,int n)
 55     {
 56         priority_queue<HeapNode> Q;
 57         for(int i = s; i <= n; i++)
 58             d[i] = INF;
 59         d[s] = 0;
 60         memset(done, 0, sizeof(done));
 61         Q.push((HeapNode)
 62         {
 63             0, s
 64         });
 65         while(!Q.empty())
 66         {
 67             HeapNode x = Q.top();
 68             Q.pop();
 69             int u = x.u;
 70             if(done[u]) continue;
 71             done[u] = true;
 72             for(int i=head[u]; i!=-1; i=edge[i].next)
 73             {
 74                 int v=edge[i].to;
 75                 if(d[v] > d[u] + edge[i].w)
 76                 {
 77                     d[v] = d[u] + edge[i].w;
 78                     Q.push((HeapNode)
 79                     {
 80                         d[v], v
 81                     });
 82                 }
 83             }
 84         }
 85     }
 86 } dij;
 87 int main()
 88 {
 89     int n,m,a,b,c;
 90     while(scanf("%d%d",&n,&m),n+m)
 91     {
 92         dij.init();
 93         repu(i,0,m)
 94         {
 95             scanf("%d%d%d",&a,&b,&c);
 96             dij.AddEdge(a,b,c);
 97             dij.AddEdge(b,a,c);
 98         }
 99         dij.dijkstra(1,n);
100         printf("%d\n",dij.d[n]);
101     }
102     return 0;
103 }
堆优化的Dij
 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstdlib>
 4 #include <algorithm>
 5 #include <cstring>
 6 #include <cmath>
 7 #include <vector>
 8 #include <queue>
 9 #include <stack>
10 #include <set>
11 #include <map>
12 using namespace std;
13 const int maxn=2200;
14 const int INF=0x3f3f3f3f;
15 struct Edge
16 {
17     int u, v, d;
18     Edge(int u, int v, int d):u(u), v(v), d(d) {}
19 };
20 struct qnode
21 {
22     int u,d;
23     qnode(int u, int d):u(u), d(d) {}
24     bool operator < (const qnode a)const
25     {
26         return d>a.d;
27     }
28 };
29 struct Dijkstra
30 {
31     int n;
32     vector<int> G[maxn];
33     vector<Edge> edge;
34     int d[maxn];
35     bool vis[maxn];
36     void init(int n)
37     {
38         this->n = n;
39         for(int i=0; i<=n; i++)
40         {
41             G[i].clear();
42             vis[i]=0;
43             d[i]=INF;
44         }
45         edge.clear();
46     }
47     void AddEdge(int u, int v, int d)
48     {
49         G[u].push_back(edge.size());
50         edge.push_back(Edge(u, v, d));
51     }
52     void dijkstra(int s)
53     {
54         priority_queue<qnode> q;
55         d[s]=0;
56         q.push(qnode(s, 0));
57         while(!q.empty())
58         {
59             qnode x=q.top();
60             q.pop();
61             if(vis[x.u])
62                 continue ;
63             vis[x.u]=true;
64             for(int i=0; i<G[x.u].size(); i++)
65             {
66                 Edge& e=edge[G[x.u][i]];
67                 if(d[e.v]>d[x.u]+e.d)
68                 {
69                     d[e.v]=d[x.u]+e.d;
70                     q.push(qnode(e.v, d[e.v]));
71                 }
72             }
73         }
74     }
75 } dij;
76 
77 int main()
78 {
79     int n, m;
80     while(scanf("%d%d", &n, &m),n+m)
81     {
82         dij.init(n);
83         while(m--)
84         {
85             int u, v, w;
86             scanf("%d%d%d", &u, &v, &w);
87             dij.AddEdge(u, v, w);
88             dij.AddEdge(v, u, w);
89         }
90         dij.dijkstra(1);
91         printf("%d\n",dij.d[n]);
92     }
93     return 0;
94 }
邻接矩阵Dij

本来以为这两个时间效率相差会很大,看来只在稠密图中奏效。

当图稠密起来后一般需要用堆优化的dijkstra。。。

转载于:https://www.cnblogs.com/ACMERY/p/4765644.html


http://chatgpt.dhexx.cn/article/ckO0CZqt.shtml

相关文章

dij算法堆优化_迪杰斯特拉算法(Dijkstra) (基础dij+堆优化) BY:优少(示例代码)...

算法实现步骤&#xff1a; a.初始时&#xff0c;只包括源点&#xff0c;即S {v}&#xff0c;v的距离为0。U包含除v以外的其他顶点&#xff0c;即&#xff1a;U {其余顶点}&#xff0c;若v与U中顶点u有边&#xff0c;则(u,v)为正常权值&#xff0c;若u不是v的出边邻接点,则(u,v…

dij算法堆优化_迪杰斯特拉算法(Dijkstra) (基础dij+堆优化) BY:优少

算法实现步骤&#xff1a; a.初始时&#xff0c;只包括源点&#xff0c;即S {v}&#xff0c;v的距离为0。U包含除v以外的其他顶点&#xff0c;即&#xff1a;U {其余顶点}&#xff0c;若v与U中顶点u有边&#xff0c;则(u,v)为正常权值&#xff0c;若u不是v的出边邻接点,则(u,v…

图的最短路径——DIJ算法,有向图的矩阵实现,图的基本操作

图是一种非常重要的数据结构&#xff0c;在研究从一点出发到各个顶点的最短距离。 实验目的 1. 掌握图的基本概念、表示方法、遍历方法。 2. 掌握图的最短路径算法。 实验要求 1&#xff0e; 输入图的顶点数n&#xff08;不超过10个&#xff09;、边数m&#xff0c;顶点分…

堆优化dij

模板 【算法介绍】 用一个优先级队列来记录点和dis值&#xff0c;按照顺序进行边的松弛即可 1.农场派对 【题意】 有向图&#xff0c;求1-n所有点中到x点一去一回的最短路的最大值 【分析】 建立原图和反图&#xff0c;以x为源点跑两次dijkstra&#xff0c;对于1-n每个点…

图中的搜索——dij

Dijkstra(迪杰斯特拉算法)常常用于求解图中的单点最短路径问题。其主要实现方法可拆分为两个步骤&#xff1a;①更新距离信息②找出当前最小路径 如下图所示&#xff0c;要求求出1结点到6结点的最短路径。 我们可以先定义一下重点内容&#xff1a; 邻接矩阵map[i][j]&#xf…

关于普通dij算法为什么不能解决负权边的分析

我们首先来分析下含负权边的无向图&#xff1a; 1.先看图 我们求A点到C点的最短距离&#xff0c;很明显答案为1. 2.我们用dij来跑下&#xff0c;看过程&#xff1a; 先把A点标记哈&#xff0c;不需要访问本身首先找到距A最近的且直接相连的点&#xff08;也就是两点间没有…

dij最短路+堆优化

dij一个主要思路&#xff0c;将所有点分为两个集合S&#xff0c;T&#xff0c;初始集合S中只包含了起点&#xff0c;T集合包含所有点&#xff0c;要做的就是从T集合中不断选取与S集合中的点距离最短的并且未被加入S集合中的点&#xff0c;将这个点加入S集合&#xff0c;并用这个…

FreeType移植到 STM32 单片机以支持矢量字体

目录 一、准备工作 二、复制文件 三、添加C文件到Keil中 四、修改接口 五、调用 六、优化 七、效果 一、准备工作 下载Freetype源码 ----- 下载FreeType 以移植到Keil 的STM32工程为例 移植前的软件环境&#xff1a; 1&#xff0c;实现了内存分配函数 2&#xff0c;实现了文件…

freetype库实现文字显示

原文&#xff1a;http://www.cnblogs.com/lifexy/p/8503070.html 1 .数码相框-通过freetype库实现矢量显示 本章主要内容如下: 1)矢量字体原理2)使用freetype库实现矢量字体显示 1. 矢量字体原理 将汉字的笔划边缘用直线段描述成封闭的曲线&#xff0c;并将线段各端点的坐标经压…

常用字体介绍(freetype)

字体显示原理 字体和图片一样&#xff0c;存储为像素&#xff0c;绘制的时候需要找到字体对应的像素显示 字体文件格式 ttf&#xff0c;只包含一种字体格式&#xff0c;矢量字体ttc&#xff0c;ttc包含多个ttf文件&#xff0c;包含多种字体格式otf&#xff0c;ttf的扩展&…

FreeType 简单使用

FreeType 2 第一步 &#xff0d;&#xff0d; 简易的字形装载 介绍 这是“FreeType2 教程”的第一部分。它将教会你如何&#xff1a; * 初始化库 * 通过创建一个新的 face 对象来打开一个字体文件 * 以点或者象素的形式选择一个字符大小 * 装载一个字形(glyph)图像&…

freetype的安装与使用

一、在PC上的安装与使用 1) 开发环境 系统版本&#xff1a; ubuntu14.04 freetype版本&#xff1a; freetype-2.4.10 gcc版本&#xff1a; gcc version 4.8.4 (Ubuntu 4.8.4-2ubuntu1~14.04.3) 2) 步骤 1. 解压缩 tar xjf freetype-2.4.10.tar.bz2 2. 配置 …

freetype环境安装记录

&#xff08;一&#xff09;摘要 最近在学习韦东山老师的驱动入门课程&#xff0c;在freetype环境安装时碰到到了一下这个报错&#xff0c;于是想记录下自己的安装过程方便其他碰到问题的同学解决&#xff01; &#xff08;二&#xff09;碰到的报错 我是用的是IMX6ULL PRO开…

freetype的简单使用

安装完毕以后我们先做个简单的实例程序看看效果 1.首先先下载字体 链接&#xff1a;https://pan.baidu.com/s/1FCOh9SYcVkYCkaT6wtXWtA 提取码&#xff1a;rohm 2.编写程序 编译测试文件example.c /*编译命令*/ -I指定库文件所在位置-L指定动态库位置gcc example.c…

(转)FreeType字体位图属性

原文链接&#xff1a;https://blog.csdn.net/wlk1229/article/details/92424456 从原文中摘取一部分记录如下&#xff1a; FreeType获取的位图是一张刚好包含文字的位图&#xff0c;不包含左右上下的空白信息。如果绘制文字时直接把每一张位图连接在一起&#xff0c;文字则会一…

freetype编译

freetype简介 FreeType库是一个完全免费(开源)的、高质量的且可移植的字体引擎&#xff0c;它提供统一的接口来访问多种字体格式文件&#xff0c;包括TrueType, OpenType, Type1, CID, CFF, Windows FON/FNT, X11 PCF等。支持单色位图、反走样位图的渲染。FreeType库是高度模块…

windows下编译OpenCV带opencv_contrib和freetype

目录 1. 下载安装cmake、opencv2. 编译freetype和harfbuzz2.1 pkg-config2.2 freetype2.3 harfbuzz2.4 修改opencv_contrib下的modules/freetype/CMakeLists.txt 3. 编译OpenCV5. 示例6. 编译好的OpenCV下载地址7. 参考文章 1. 下载安装cmake、opencv cmake下载地址&#xff1…

嵌入式应用-详解移植并使用freetype显示文字

目录 前言 1. freetype和相关概念简介 2.freetype显示文字流程和主要函数 2.1 包含头文件及API头文件&#xff1a;ft2build.h 2.2 初始化&#xff1a; FT_InitFreetype 2.3 加载&#xff08;打开&#xff09;字体Face&#xff1a; FT_New_Face 2.4 设置字体大小&#x…

freetype用法

freetype用法 文章目录 freetype用法0.实现1.变量定义2.lcd操作获取屏幕信息3.freetype初始化4.绘画 1.字形度量2.类1.FT 中的面向对象2.FT_Library 类3.FT_Face 类4 FT_Size 类5 FT_GlyphSlot 类 3.函数1.把一个字符码转换为一个字形索引FT_Get_Char_Index函数2.从 face 中装…

FreeType使用

前言 在openGL绘制字体&#xff0c;我们一般都使用freeType字体库&#xff0c;如下图所示 下载 freeType官网 编译源码 使用CMake编译源码 如果嫌麻烦&#xff0c;我这里有编译好的库&#xff0c;包括头文件、lib静态库、dll动态库 编译好的lib和dll库下载地址 例子 …