文章目录

  • 题目解答
  • 题目链接

题目解答



来源:acwing

分析:
题目给定所有答案不超过1e6,其实也就保证了连续小路的长度不超过1000(1000的平方就是1e6)。这样我们就可以在题目给定的条件下,枚举出所有连续小路的情况。比如终点n号点,通向它的可能有m个点,其中有的是小路,有的是大路,我们可以分类来处理边权。

我们用拆点来做这道题。 将每个点多拆出1001个点,意思是对最后一段的路况进行分情况讨论,可能不是小路,长度是0;可能是小路,长度是2,3,…1000,很多种情况,反正题目给定最后的小路的长度不会超过1000. 而且只需要计算题目给定的数据即可。

Dist[i][j]Dist[i][j]Dist[i][j]表示从1到点i的最短距离,第二维j表示1到i点这条路径上最后那段(连接i)的小路的长度。如果1到i的路径最后那段是大路,那么j 置为0.

那最后的答案是什么呢? 是dist[n][i]dist[n][i]dist[n][i],枚举每个i从0到1000,取出最小值即可。
具体分析如下图:

这样建边的时候add函数需要考虑这条路的类型是什么,是大路还是小路。

ac代码

#include<bits/stdc++.h>
using namespace std;
const int N = 510, M = 200010;
const int INF = 1e6;
int n, m;
int h[N], e[M], ne[M], w[M], idx;
int f[M];// 边的类型,大路还是小路
bool st[N][1010];
int dist[N][1010];//第二维为拆点struct Node{// 含义:点的编号,最后一段小路的长度,1到x点的最短距离int x, y, v;// 小根堆(距离从小到大)bool operator<(const Node& t)const{return v > t.v;}
};void add(int t, int a, int b, int c){e[idx] =b ,w[idx] = c, f[idx] = t,ne[idx] = h[a], h[a] = idx ++;
}void dijkstra(){memset(dist, 0x3f, sizeof dist);priority_queue<Node> heap;heap.push({1, 0, 0});dist[1][0] = 0;while(heap.size()){auto t = heap.top();heap.pop();if(st[t.x][t.y]) continue;st[t.x][t.y] = true;for(int i = h[t.x]; ~i; i= ne[i]){int x = e[i], y = t.y;//最后一段小路的长度yif(f[i]){// 小路y += w[i]; //小路长度更新if(y <= 1000){ // 小路长度不会超过1000if(dist[x][y] > t.v - t.y * t.y + y * y){// 更新1到x点的最短路dist[x][y] = t.v - t.y * t.y + y * y; if(dist[x][y] <= INF){// 加入堆heap.push({x, y, dist[x][y]});}}}}else{ // 大路if(dist[x][0] > t.v + w[i]){dist[x][0] = t.v + w[i];//权值累加if(dist[x][0] <= INF)heap.push({x,0, dist[x][0]});}}}}
}int main(){cin >> n >> m;memset(h, -1, sizeof h);while(m --){int t, a, b, c;cin >> t >> a >> b >> c;add(t, a, b, c), add(t, b, a, c);}dijkstra();int res = INF;// dist[n][i] 表示最后一段小路的长度为i的前提下,1到n的最短路// 我们通过dijkstra算法求得了合法的、最后一段是小路、但是小路长度不同的所有情况// 取min即可for(int i = 0; i <= 1000; i ++) res = min(res, dist[n][i]);cout << res << endl;
}

题目链接

https://www.acwing.com/problem/content/3258/

CSP认证201712-4 行车路线[C++题解]:单源最短路变型、拆点、好题!相关推荐

  1. [AcWing算法提高课]之图论 单源最短路的综合应用(C++题解)

    目录 1)热浪(板子题) (朴素dijkstra) O(n2) (堆优化dijkstra) O((n+m)logm) (spfa) O(m) 2)信使 3)香甜的黄油 4)最小花费 5) 最优乘车 6 ...

  2. CSP认证201803-2 碰撞的小球[C++题解]:模拟

    文章目录 题目解答 题目链接 题目解答 来源:acwing 分析: 题目理解: 给定水平方向的线段和n个小球,给定速度和碰撞后反向运动等条件,模拟小球碰撞过程,求解最后时刻所有小球的位置. 题目解答: ...

  3. CSP认证201809-4 再卖菜[C++题解]:差分约束、前缀和

    文章目录 题目解答 题目链接 题目解答 来源:acwing 分析: 对于a0,a1,...,ana_0, a_1,...,a_na0​,a1​,...,an​,经过计算相邻的数的平均值得到b0,b1, ...

  4. CSP认证201712-1 最小差值[C++题解]:遍历

    文章目录 题目解答 题目链接 题目解答 来源:acwing 分析: 直接排序,然后取相邻两数之差的最小值. ac代码 #include<bits/stdc++.h> using names ...

  5. CSP认证201609-4 交通规划[C++题解]:最短路径树、dijkstra求单源最短路、递推思想

    题目分析 来源:acwing 分析: 这题是最短路树.保持原图中所有点到根结点的最短距离不变,然后在原图中选择一些边,使所有点连通的最短路是多长. 最短路径树,是一种使用最短路径算法生成的数据结构树. ...

  6. CSP认证201512-2 消除类游戏[C++题解]:模拟

    题目分析 来源:acwing 分析: 本题类似消消乐,同一行或者同一列满足3个或者更多个同色的可以消除(数值置为0),由于数据量比较小,时间复杂度可以到O(n3)O(n^3)O(n3). 这里是对每个 ...

  7. CSP认证201509-3 模板生成系统[C++题解]:字符串处理、模拟、哈希表、引号里面有空格的字符串怎么读入

    题目分析 来源:acwing 分析: 本题采用vector< string > 来读入原来模板.接下来的m行需要用到哈希表,进行模板和具体内容的映射. 遍历vector,如果找到{{,就对 ...

  8. CSP认证201412-4 最优灌溉[C++题解]:最小生成树裸题、Kruskal算法求最小生成树

    题目分析 来源:acwing 分析:这是一道最小生成树的裸题. 这里默写Kruskal求最小生成树的最小费用的模板. 最小生成树模板请参考笔者的另一篇博文: 最小生成树板子-AcWing 859. K ...

  9. CSP认证201412-2 Z字形扫描[C++题解]:模拟

    文章目录 题目解答 题目链接 题目解答 分析: 转换视角,斜着当作一行,然后就是简单地从左到右和从右到左循环. 具体分析过程如下图: AC代码 #include<bits/stdc++.h> ...

最新文章

  1. 大型数据库设计原则与技巧
  2. java 处理 url_Java URL处理 - Java 教程 - 自强学堂
  3. JavaScript匿名函数与托付
  4. [国嵌攻略][084][信号同步编程]
  5. PAT乙级(1032 挖掘机技术哪家强 )
  6. wegwegwegwegweg
  7. Android WebView重定向问题,Android Webview重定向问题解决方法
  8. 深入理解注意力机制(Attention Mechanism)和Seq2Seq
  9. PyCharm安装配置教程
  10. AMR在IP域中的编码(rfc3267,4867)
  11. 计算机怎么在表格里打勾,怎样在Excel输入对号√,Excel单元格怎么输入对号(方框内打勾)?...
  12. 4. 查询表orders——检索所有订单订购物品的总数
  13. scout_mini使用步骤
  14. Css动画效果旋转图片
  15. 日志收集之--将Kafka数据导入elasticsearch
  16. 记录某大门户网站自动跳转不良网站,团队通宵排查病毒木马全过程
  17. 3、xx配音狂app登陆算法分析【Android逆向分析学习】
  18. 字符映射表没有所有字体(专用字符),以及显示空白的解决办法
  19. Qt Quick 如何入门?
  20. 项目开发(质检督查)

热门文章

  1. linux的开机网络设置
  2. JS中的!= 、== 、!==、===的用法和区别
  3. sed行处理详解(交换行,合并行,删除行等)
  4. (笔记)Mysql命令grant on:增加新用户并控制其权限
  5. @清晰掉 GNU C __attribute__
  6. linux内核学习之三:linux中的32位与64位
  7. C++的沉迷与爱恋——侯捷
  8. 必会重构技巧(三):提取接口
  9. mysql -u -p -d_mysqld_exporter监控mysql
  10. 【控制】《多智能体系统一致性与复杂网络同步控制》郭凌老师-第9章-结论与展望