[Algotithm] 最短路之旅

这可能是非常久以前的东西。

不过想想复习一下也是好的(其实是发现居然不会dijkstra了)。

一、通用原理

维护一个数组记录所有点的最短路。

枚举边确认是否可以通过这条边减小其它点的最短距离。

得出答案。

二、主流算法

  A. Dijkstra

    Dijkstra,荷兰人。

    Dijkstra要求提供两个点集,分别用于存放不再修改的点与待修改的点(也就是是否找到最短路)

    显然第一个不再修改的点是起点,且其最短路为0。

    那么,首先找到已知的最短路径最短的点(想象一个凸多边形,哪里离中心最近就哪里进行扩张)。

    然后这个点扔进不再修改的点集(记为A)。

    然后枚举其边以更新其它点的最短路。

    显然,这种方式将持续n次,因为每次都必然扔且只扔一个点进去点集A。

    然后查找的过程又是n次。

    最后枚举边如果用邻接矩阵的话也是n次,如果用邻接表的话可以E(E是边数)。

    PS:我并不是说准确次数啊,n-1 接近 n 所以我直接说 n QwQ

    那么朴素dijkstra的复杂度就是O(n^2+nE),近似看作O(n^2)。

    

    堆优化:

      想要减小时间复杂度,第一个要优化的就是查找枚举基点的过程,毕竟每次都O(n)。

      这段部分就其根本是要找到可修改的最短距离。

      那么我们可以用一个堆(或优先队列)代替原来的朴素队列使得我们要找的最小dis每次就在堆顶。

      

    题目:

      单源最短路:https://www.luogu.org/problem/show?pid=3371

      这道题数据还算不错。

      注意:数据大小需要注意。

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<queue>
 4 #define maxn_P 10101
 5 #define maxn_E 505050
 6 #define INF 2147483647
 7 using namespace std;
 8 typedef pair<int,int> node;
 9
10 struct edge{
11     int from,v,len;
12 }e[maxn_E];
13
14 int first[maxn_P],tot,dis[maxn_P],n,m,s,a,b,c;
15 bool book[maxn_P];
16
17 void insert(int u,int v,int len){
18     tot++;
19     e[tot].from = first[u];
20     e[tot].v = v;
21     e[tot].len = len;
22     first[u] = tot;
23 }
24
25 void dijkstra(){
26     for(int i = 1;i <= n;i++) dis[i] = INF;
27
28     priority_queue<node,vector<node>,greater<node> > q;
29
30     dis[s] = 0;
31
32     q.push(make_pair(dis[s],s));
33
34     while(!q.empty()){
35         node tmp = q.top();
36         q.pop();
37         int p = tmp.second;
38
39         if(!book[p]){
40             book[p] = true;
41             for(int i = first[p];i;i = e[i].from){
42                 if(dis[e[i].v] > dis[p]+e[i].len){
43                     dis[e[i].v] = dis[p]+e[i].len;
44                     q.push(make_pair(dis[e[i].v],e[i].v));
45                 }
46             }
47         }
48     }
49 }
50
51 int main(){
52     scanf("%d%d%d",&n,&m,&s);
53
54     for(int i = 0;i < m;i++){
55         scanf("%d%d%d",&a,&b,&c);
56         insert(a,b,c);
57     }
58
59     dijkstra();
60
61     for(int i = 1;i <= n;i++){
62         printf("%d ",dis[i]);
63     }
64
65     return 0;
66 }

推荐不看

        

To be filled

时间: 2024-11-29 06:14:53

[Algotithm] 最短路之旅的相关文章

[最短路]P1078 文化之旅

题目描述 有一位使者要游历各国,他每到一个国家,都能学到一种文化,但他不愿意学习任何一 种文化超过一次(即如果他学习了某种文化,则他就不能到达其他有这种文化的国家).不 同的国家可能有相同的文化.不同文化的国家对其他文化的看法不同,有些文化会排斥外来 文化(即如果他学习了某种文化,则他不能到达排斥这种文化的其他国家). 现给定各个国家间的地理关系,各个国家的文化,每种文化对其他文化的看法,以及这 位使者游历的起点和终点(在起点和终点也会学习当地的文化),国家间的道路距离,试求 从起点到终点最少需

ACM学习历程—广东工业大学2016校赛决赛-网络赛C wintermelon的魔界寻路之旅(最短路 &amp;&amp; 递推)

题目链接:http://gdutcode.sinaapp.com/problem.php?cid=1031&pid=2 题目由于要找对称的路径,那么狠明显可以把右下角的每一块加到左上角对应的每一块上.然后就变成从左上角走到对角线的最短路径的个数. 先跑一遍最短路径得到p(i, j)从起点到(i, j)的最短路径. 然后就是找最短路径的个数.显然cnt(i, j)是它周围点能通过最短路径到它的cnt的和.这一处可以使用记忆化搜索来完成. 代码: #include <iostream> #

POJ 2677 Tour 双调旅行商 dp, double+费用流

题目链接:点击打开链接 题意:给定二维平面上的n个点 从最左端点到最右端点(只能向右移动) 再返回到到最右端点(只能向左移动,且走过的点不能再走) 问最短路. 费用流: 为了达到遍历每个点的效果 把i点拆成 i && i+n 在i ->i+n 建一条费用为 -inf 的边,流量为1 这样跑最短路时必然会经过这条边,以此达到遍历的效果. dp :点击打开链接 对于i点 :只能跟一个点相连 -- 1.跟 i-1点相连 2.不跟i-1相连 用dp[i][j] 表示两个线头为 i 和 j 的

2014.10.28模拟赛【时间与空间之旅】

Porble 1时间与空间之旅(tstrip.*) 题目描述 公元22××年,宇宙中最普遍的交通工具是spaceship.spaceship的出现使得星系之间的联系变得更为紧密,所以spaceship船长也成了最热门的职业之一.当然,要成为一名出色的船长,必须通过严格的考核,例如下面是最简单的问题中的一个. 用1~n的整数给n个星系标号,目前你在标号为1的星系,你需要送快递到标号为n的星系,星系之间由于存在陨石带,并不是都可以直连的.同时,由于超时空隧道的存在,在某些星系间飞行会出现时间静止甚至

第三关 ——图论:最短路

14:52:09 今天天气好晴朗,处处好风光. 阳光犹如希望,我即将要回去打游戏的希望,希望那么那么大,那么那么刺眼!!! 好的,接下来为您播报考试后续情况:不算太差,还看得过去,至少,应该能活着把年过过去.接下来,就介绍一下在父母看到成绩后想要打你时如何通过最短路逃跑 目录 Dijkstra算法 Bellman-Ford算法 SPFA算法 Floyd算法 首先,要来简单论述一下“最短路”这个问题.要求最短路,无论什么方法,都要先存图. 百“路”图为先 那么,图分为两种,有向图与无向图.无论是有

hdu3461Marriage Match IV 最短路+最大流

//给一个图.给定起点和终点,仅仅能走图上的最短路 //问最多有多少种走的方法.每条路仅仅能走一次 //仅仅要将在最短路上的全部边的权值改为1.求一个最大流即可 #include<cstdio> #include<cstring> #include<iostream> #include<queue> #include<vector> using namespace std ; const int inf = 0x3f3f3f3f ; const

【Floyd】文化之旅

[NOIP2012]文化之旅 题目描述 有一位使者要游历各国,他每到一个国家,都能学到一种文化,但他不愿意学习任何一 种文化超过一次(即如果他学习了某种文化,则他就不能到达其他有这种文化的国家).不 同的国家可能有相同的文化.不同文化的国家对其他文化的看法不同,有些文化会排斥外来 文化(即如果他学习了某种文化,则他不能到达排斥这种文化的其他国家). 现给定各个国家间的地理关系,各个国家的文化,每种文化对其他文化的看法,以及这 位使者游历的起点和终点(在起点和终点也会学习当地的文化),国家间的道路

UESTC30-最短路-Floyd最短路、spfa+链式前向星建图

最短路 Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的T-shirt.但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线,你可以帮助他们吗? Input 输入包括多组数据. 每组数据第一行是两个整数NN ,MM (N≤100N≤100 ,M≤10000M≤1000

ACM: HDU 2544 最短路-Dijkstra算法

HDU 2544最短路 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Description 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt.但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线,你可以帮助他们吗? Input 输入包括多组数据.每组数据第一行是两个整数N.M(N<=100,M<