最短路-dij

最短路,也是单源最短路,能够求出从一个点到达其他所有点的最短距离(n是点,m是边E是不确定)

算法有 Dij(O(n2)很稳定)  SPFA(O(nE到nm),据说有很多优化方案,但每种方案又有对应卡你过不去的策略,不建议使用但是据说网络流必须用他) Floyd(O(n3),内部含有dp思想,平时90%不用)Bellman主要判断是否有负环(O(nm)) Dij+堆(O(mlgm)以后解决最短路常用方法,高效又稳定)

其中Dij主要用于正权图,如果有负环需要用SPFA或Bellman

说一下DIJ

数组定义f[x][y]代表 x到y中间有一条路 (因此双向边的时候一定记着把f[y][x]也设置一下)

Vis[x]代表是否走到x

Dis[x]代表当前到达x的最短距离

DIj的过程其实就是一直找连通块外中,且只经过连通块内的点,距离源点(最开始连通块只有起始节点)最近的点,因为这个点一定不能通过其他点来节约距离,所以这个点相当于求出最短路了,由于这个点也加入连通块了,所以要更新DIs(也就是距离当前连通块最近的点)

很多同学不会判-1,有几种方法

  1. 初始化是INF,最后判断DIs是否是INF即可
  2. 如果vis【n】没有更改,说明n没走过,也是-1
  3. 当函数跑到n以后,直接返回dis[n],否则返回-1

#include<stdio.h>

#include<string.h>

#include<algorithm>

using namespace std;

#define rep(i,j,k) for(int i=j;i<=k;++i)

#define INF 0x3f3f3f3f

#define MAXN 1005

int f[MAXN][MAXN];

int dist[MAXN],dis[MAXN];

bool vis[MAXN];

int n;

void dijkstra(int x)

{

int i,j;

memset(vis,true,sizeof(vis));

rep(i,1,n)

dist[i]=f[x][i];

vis[x]=false;

int id;

rep(i,1,n-1)

{

id=-1;

rep(j,1,n)

{

if(vis[j]&&(id==-1||dist[j]<dist[id]))

id=j;

}

if(id==-1)

return ;

vis[id]=false;

rep(j,1,n)

{

if(vis[j]&&dist[id]+f[id][j]<dist[j])

dist[j]=dist[id]+f[id][j];

}

}

}

int main()

{

int m;

while(scanf("%d %d",&m,&n)!=EOF)

{

int a,b,v;

memset(f,INF,sizeof(f));

rep(i,1,m)

{

scanf("%d %d %d",&a,&b,&v);

f[a][b]=min(f[a][b],v);

f[b][a]=min(f[b][a],v);

}

dijkstra(1);

printf("%d\n",dist[n]);

}

}

原文地址:https://www.cnblogs.com/noncontradiction/p/10161787.html

时间: 2024-11-11 11:35:18

最短路-dij的相关文章

hdu--2544--题如其名&lt;最短路&gt;--dij&lt;priority_queue&gt;||spfa&lt;queue&gt;

这题 让我深刻地 感受到了 题如其名 =-= ......... 一直以来都写spfa 这次 也顺便写了下 dij<链式前向星&&priority_queue> 代码太长了.. 但是 要是思路清晰的话 写下去的感觉很爽的... 当然 我还是更加喜欢 spfa 关于 链式前向星 可以---传送--出产地学习 关于 spfa -- 我没找到特别出色的介绍<我也写过..> 这个不难 你可以随便去找一篇来学习 关于 dij -- 也是图论的入门重要算法 介绍它的博客实在太多

HDU 6071 Lazy Running (同余最短路 dij)

Lazy Running Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 524288/524288 K (Java/Others)Total Submission(s): 1384    Accepted Submission(s): 597 Problem Description In HDU, you have to run along the campus for 24 times, or you will fail in

HDU2544 最短路dij

纯最短路. 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 <

哈理工 oj 2122 旅行(map + 最短路dij算法)

旅行 Time Limit: 1000 MS Memory Limit: 32768 K Total Submit: 18(6 users) Total Accepted: 3(3 users) Rating: Special Judge: No Description "04.24,和Sakura去东京天空树,世界上最暖和的地方天空树的顶上. " "04.26.和Sakura去明治神宫.有人在那里举办婚礼." "04.25.和Sakura去迪士尼.鬼屋非

哈理工oj Touring (最短路 dij算法 邻接表 + 队列 )

Touring Time Limit: 1000 MS Memory Limit: 32767 K Total Submit: 257(46 users) Total Accepted: 108(39 users) Rating: Special Judge: No Description The best friends Mr. Li and Mr. Liu are touring in beautiful country M. M has n cities and m two-way roa

【日常学习】【条件最短路dij】POJ1062 昂贵的聘礼(2002年浙江省队选拔赛) 题解

耗时三节课 充分体现出粗心酿成大错这个道理 一开始一直不知道为什么数组越界 原来是minn和ninj写反了 后来又因为杜如函数出为题 反复调试 今后一定要注意 题目还是放上吧: 题目描述 Description 年轻的探险家来到了一个印第安部落里.在那里他和酋长的女儿相爱了,于是便向酋长去求亲.酋长要他用10000个金币作为聘礼才答应把女儿嫁给他.探险家拿不出这么多金币,便请求酋长降低要求.酋长说:"嗯,如果你能够替我弄到大祭司的皮袄,我可以只要8000金币.如果你能够弄来他的水晶球,那么只要5

wenbao与最短路dij

----------------------- http://acm.hdu.edu.cn/showproblem.php?pid=1874 裸题 1 #include <stdio.h> 2 #include <string.h> 3 #include <algorithm> 4 using namespace std; 5 6 #define N 10000000 7 int road[200][200], vis[200]; 8 int dij[200], n,

M - 昂贵的聘礼 最短路 dij

http://poj.org/problem?id=1062 这个题目有一点点特别,因为数据很小也可以用Floyd跑,但是个人比较钟爱dij. 这个dij是怎么走的呢,首先就是普通的建图,然后就是带上一个地位限制的dij,其他都是一样的. #include <cstdio> #include <cstring> #include <cstdlib> #include <queue> #include <vector> #include <a

Codeforces Round #621 (Div. 1 + Div. 2)D dij(思维)

题:https://codeforces.com/contest/1307/problem/D 题意:给定无向图,n为点,m为边.在给个k,为特殊点的数目,题目要求在这些特殊点上连一条边,让新图最短路尽可能大,问新图最短路(1到n)是多少? 分析:因为题目保证连通且原本的图一定可以从1到n,我们假设原本的图最短路为ans: 易得虽然要求我们最大化最短路,但是加一条边只可能让答案不变或变小(因为一定要加这条边),不会使最短路变大: 假设我们在特殊点x和y之间加了边,要是新图的最短路有走这条边,那么