首页 > 其他分享 >行车路线

行车路线

时间:2023-12-27 11:14:47浏览次数:25  
标签:行车 dist weight idx int 路线 dijkstra include

算法思想:将信息存储为邻接表。由于连续小道长度的不同,将点拆为不同的若干点。运用小项堆优化的 dijkstra对由1到不同点的最小疲劳值进行更新,同时用path和continuelength分别记录优化后节点对应上一个结点的数据(点标号和连续小路)。最后在每个点的所有拆点中找出最小的路径输出,对于n一次次向前(利用该节点存储的上一个结点的信息)推得出最短路径。

主要/核心函数分析://堆优化版dijkstravoid dijkstra()初始化dist数组(储存不同的拆点x到1的最短疲惫值)。从1开始(此时1点的连续小路为0,最短疲惫值为0)对与它相连的点进行遍历,如果经过1的疲惫值比原先的要小,就更新dist对应的拆点,同时将该拆点的数据存入小项堆,依次取出堆中元素对dist进行更新,直到堆中没有元素。

测试数据:

6 7

1 1 2 3

1 2 3 2

0 1 3 30

0 3 4 20

0 4 5 30

1 3 5 6

1 5 6 1

运行结果:

到1最小疲劳值0

到2最小疲劳值9

到3最小疲劳值25

到4最小疲劳值45

到5最小疲劳值66

到6最小疲劳值76

最短路径为:

6 5 4 3 2 1

  1 #include <iostream>
  2 #include <cstring>
  3 #include <algorithm>
  4 #include <queue>
  5 #include <fstream>
  6 
  7 using namespace std;
  8 
  9 const int N = 510, M = 200010, INF = 0x3f3f3f3f;
 10 int h[N],                    e[M],          w[M], tag[M], ne[M],        idx;
 11 //以该顶点为起点的边的编号,该编号边的终点,权重,类型,与该边关联的边,编号
 12 int dist[N][1010];//连续小道的长度之和一定不会超过1000。
 13 //dist[i][j]——表示从1号点走到第i号点,路径包含最后一段是连续小道的总长度为j的最短路径
 14 bool st[N][1010];//点的去重标记也跟随拆点
 15 int path[N][1010];//记录连续长度为j时的前驱节点
 16 int continuelength[N][1010];//记录连续长度为j的前驱节点的最短路径的连续长度
 17 int n, m;//点数和边数
 18 
 19 //邻接表
 20 void add(int t, int a, int b, int c) 
 21 {
 22     e[idx] = b, w[idx] = c, tag[idx] = t, ne[idx] = h[a], h[a] = idx++;
 23 }
 24 
 25 struct Node 
 26 {//拆点,由于y的不同,x号点被拆成若干点
 27     int x, y, d;//y是小道的连续长度,d为最短疲惫
 28     bool operator<(const Node& p)const 
 29     {
 30         return d > p.d;
 31     }
 32 };
 33 
 34 //堆优化版dijkstra
 35 void dijkstra() 
 36 {
 37     priority_queue<Node> heap;//priority_queue默认大根堆,由于Node内置排序为降序,因此实际意义还是小根堆
 38     heap.push({ 1,0,0 });
 39     memset(dist, 0x3f, sizeof dist);
 40     dist[1][0] = 0;
 41     while (heap.size()) 
 42     {
 43         Node t = heap.top();
 44         heap.pop();
 45 
 46         //已经访问
 47         if (st[t.x][t.y])continue;
 48 
 49         st[t.x][t.y] = true;//标记,将该点拆开来
 50 
 51         //访问与t.x相邻的点
 52         for (int i = h[t.x]; i != -1; i = ne[i]) 
 53         {
 54             int k = e[i], weight = w[i];
 55             if (tag[i]) 
 56             {//小路
 57                 if (t.y + weight <= 1000)//连续小道的长度之和一定不会超过1000
 58                     if (dist[k][t.y + weight] > t.d - t.y * t.y + (t.y + weight) * (t.y + weight)) 
 59                     {
 60                         dist[k][t.y + weight] = t.d - t.y * t.y + (t.y + weight) * (t.y + weight);
 61                         if (dist[k][t.y + weight] <= INF) heap.push({ k,t.y + weight,dist[k][t.y + weight] });
 62                         path[k][t.y + weight] = t.x;
 63                         continuelength[k][t.y+weight] = t.y;
 64                     }
 65             }
 66             else 
 67             {//大路
 68                 if (dist[k][0] > t.d + weight) 
 69                 {
 70                     dist[k][0] = t.d + weight;
 71                     if (dist[k][0] <= INF) heap.push({ k,0,dist[k][0] });
 72                     path[k][0] = t.x;
 73                     continuelength[k][0] = t.y;
 74                 }
 75             }
 76         }
 77     }
 78 }
 79 
 80 int main() 
 81 {
 82     memset(h, -1, sizeof h);
 83 
 84     fstream fp;
 85     fp.open("test.txt", ios::in);
 86 
 87     fp >> n >> m;
 88 
 89     int t, a, b, c;
 90     while (m--) 
 91     {
 92         fp >> t >> a >> b >> c;
 93         //无向图
 94         add(t, a, b, c);
 95         add(t, b, a, c);
 96     }
 97     fp.close();
 98 
 99     dijkstra();
100 
101     vector<int>ans;
102     ans.push_back(0);
103     int nlianxu;
104     for (int j = 2; j <= n; j++)
105     {
106         int res = INF;
107         nlianxu = 0;
108         for (int i = 0; i <= 1000; i++)
109         {
110             if (res > dist[j][i])
111                 nlianxu = i;
112             res = min(res, dist[j][i]);
113         }
114         ans.push_back(res);
115     }
116 
117     for (int i = 0; i < n; i++)
118         cout << "到" << i + 1 << "最小疲劳值" << ans[i] << endl;
119 
120     cout << "最短路径为:" << endl;
121     int endknot = n;
122     while (path[endknot][nlianxu])
123     {
124         cout << endknot << " ";
125         int k = endknot;
126         endknot = path[k][nlianxu];
127         nlianxu = continuelength[k][nlianxu];
128     }
129     cout << 1;
130 }

 

标签:行车,dist,weight,idx,int,路线,dijkstra,include
From: https://www.cnblogs.com/saucerdish/p/17930122.html

相关文章

  • 世微 AP5102三路线性LED恒流芯片 LED照明驱动IC
    说明 AP5102是一款电路简洁的三路线性LED恒流驱动器,适用于5-46V电压范围的LED恒流照明领域。芯片PWM端口支持高辉调光,能够响应60ns超小脉宽的PWM调光信号。芯片采用我司算法,为客户提供解决方案,限度发挥灯具优势,以实现景观舞台灯高辉的调光效果,65535256*256)级高......
  • 2023年最实用的Android Framework学习路线,让你轻松通过面试和适应实际工作
    许多Android开发者和应聘者都曾反映,在面试或考核过程中,经常遇到与AndroidFramework相关的问题。这些问题常常让他们感到困惑和不安,因为这些问题的确需要深入的理解和扎实的基础。Framework层的原理和机制对于Android开发来说至关重要。从应用启动到用户使用,整个过程中都离不开Fram......
  • 封神级 Android 音视频开发学习路线
    前言在日常生活中,视频类应用占据了我们越来越多的时间,各大公司也纷纷杀入这个战场,不管是抖音、快手等短视频类型,虎牙、斗鱼等直播类型,腾讯视频、爱奇艺、优酷等长视频类型,还是Vue、美拍等视频编辑美颜类型,总有一款适合你。随着5G普及以及网络资费的下降,音视频的前景是非常广阔的。......
  • 1.项目搭建与完成路线模块
    一、DotNetCore的发展(一)DotNetFramework和DotNetCore​ 在DotNetCore出现之前,微软的应用开发主体是面向自家的Windows操作系统,早在2002年的时候,微软发布了.NetFrameWork的早期版本,即DotNet1.0版本,秉承着开源侵犯知识产权的心理,对于DotNetFrameWork这一条产品线,微软始终没有进行......
  • springboot004旅游路线规划系统(Java毕业设计,附数据库和源码)
    第一章绪论1.1选题背景与研究意义随着社会的不断进步,在居民生活水平提高的同时,人们当前在生活的方方面面也越来越注重服务所带来的体验,随着近几年国家政策大力发展旅游业,旅游景点的建设越来也完善,旅游业的发展速度得到了显著的提升。各大旅行社、旅游景点都不断的推出新的活动计......
  • 【专题】2023年中国人工智能医学影像产品生态路线研究报告PDF合集分享(附原数据表)
    原文链接:https://tecdat.cn/?p=34466原文出处:拓端数据部落公众号未来,生成式人工智能将推动AI医学影像企业的指数级增长,而综合性医学人工智能模型与医学影像领域的结合将释放巨大潜力。为加速自身商业化落地能力,AI医学影像企业将依托生态路线。阅读原文,获取专题报告合集全文,解锁......
  • 2023 最新绿源 D-S70 电动自行车评测 All In One
    2023最新绿源D-S70电动自行车评测AllInOne绿源D-S70电动自行车踩坑经历D=>Dian=>电动车上海购车踩坑电动车产品名称乱写,明明广告宣传是S70-D,实际上App却显示是D-S70,一般用户根本分不清,到底哪个才是对的名称;线下店铺售价偏高,网上售价3899,实际到......
  • 259k+ Star!这是我见过最全的开发者技术学习路线!
    大家好,我是Java陈序员。自从上班后,身体是一天不如一天了,也很少有时间可以去学习新技术了。程序员如果技术跟不上,很容易就被淘汰。而碎片化的学习效率又不高,往往今天学了,明天就忘了。有时候更是不知道要学习什么技术!今天给大家推荐一个开发者技术学习路线,让我们在学习技术时可......
  • 金恒科技无人行车助力钢铁企业数智化转型
    行车作为钢铁行业的核心起重设备之一,推动着钢铁行业重载物流系统变革,保障着企业安全生产、高效运作。面对复杂的生产环境,钢铁企业对车间生产的性能、灵活性、数字化等方面提出了更高的创新需求。同时,自动化、信息化技术与行业细分场景的融合不断推动着行业生产效率、产品质量等全过......
  • PHP学习路线图(二)(天工AI生成)
    学习PHP的基本概念和语法要学习PHP的基本概念和语法,你可以从以下几个方面入手:PHP基础知识首先,你需要了解PHP的基础知识,包括它的语法规则、变量、数据类型和常量等。你可以通过阅读《PHP教程-菜鸟教程》来获取这些基础知识。这个教程适合PHP初学者,并提供了从基础到高级的学习线路......