最短路算法 —— Dijkstra算法
用途:
解决单源最短路径问题(已固定一个起点,求它到其他所有点的最短路问题)
算法核心(广搜):
(1)确定的与起点相邻的点的最短距离,再根据已确定最短距离的点更新其他与之相邻的点的最短距离。
(2)之后的更新不需要再关心最短距离已确定的点
三种实现模板:
一、矩阵朴素版
二、vector简单版
三、静态邻接表有点复杂版
#include <iostream>
#include <algorithm>
#include <cstring>
#include <deque>
#include <cstdio>
#include <vector>
#include <queue>
#include <cmath>
#define INF 0x3f3f3f3f
using namespace std; //邻接矩阵 const int MAXN = ;
int dis[MAXN];
int e[MAXN][MAXN];
bool vis[MAXN];
int N, M; void dij()
{
int p, mis;
for(int i = ; i <= N; i++)
dis[i] = e[][i]; vis[] = true;
dis[] = ;
for(int i = ; i < N; i++)
{
mis = INF;
for(int j = ; j <= N; j++)
{
if(!vis[j] && dis[j] < mis)
{
mis = dis[j];
p = j;
}
}
vis[p] = true; for(int k = ; k <= N; k++)
{
if(dis[k] > dis[p] + e[p][k] && !vis[k])
dis[k] = dis[p] + e[p][k];
}
}
} void init()
{
for(int i = ; i <= N; i++)
for(int j = ; j <= N; j++)
if(i == j) e[i][j] = ;
else e[i][j] = INF;
memset(vis, false, sizeof(vis));
}
int main()
{
int a, b, c;
while(~scanf("%d%d", &N, &M))
{
if(N == && M == ) break;
init();
while(M--)
{
scanf("%d%d%d", &a, &b, &c);
e[a][b] = c;
e[b][a] = c;
} dij();
printf("%d\n", dis[N]);
} return ;
} //vector 动态邻接表 + 优先队列 const int MAXN = 1e3 + ;
struct edge
{
int to, cost;
edge(int vo = , int vt = ):
to(vo),cost(vt){}
}; vector<edge>G[MAXN];
typedef pair<int, int>P;
int dis[MAXN];
int N, M; void init()
{
for(int i = ; i <= N; i++)
{
G[i].clear();
dis[i] = INF;
} }
void Dijkstra(int s)
{
int u, v;
priority_queue<P, vector<P>, greater<P> > que;
que.push(P(, s));
dis[s] = ; while(!que.empty())
{
P p = que.top(); que.pop(); int u = p.second;
if(dis[u] < p.first) continue; for(int i = ; i < G[u].size(); i++)
{
edge v = G[u][i];
if(dis[v.to] > dis[u] + v.cost)
{
dis[v.to] = dis[u] + v.cost;
que.push(P(dis[v.to], v.to));
}
}
}
} int main()
{
int u, v, c;
scanf("%d%d", &N, &M);
init();
while(M--)
{
scanf("%d%d", &u, &v, &c);
G[u].push_back(edge(v, c));
//G[v].push(edge(u, c)); 建无向图
} //see see
/*
for(int i = 1; i <= N; i++)
{
for(int j = 0; j < G[i].size(); j++)
printf("%d ", G[i][j].to);
puts("");
}
*/ Dijkstra();
for(int i = ; i <= N; i++)
printf("%d ", dis[i]);
puts(""); return ;
} ///静态邻接表 + 优先队列优化 const int MAXN = 1e3 + ;
typedef pair<int, int> HeapNode;
struct edge
{
int v, nxt, w;
}G[MAXN*];
int head[MAXN], dis[MAXN];
int N, M, cnt; inline void init()
{
for(int i = ; i <= N; i++)
head[i] = -, dis[i] = INF;
cnt = ;
} inline void add(int from, int to, int we)
{
G[cnt].w = we;
G[cnt].v = to;
G[cnt].nxt = head[from];
head[from] = cnt++;
} void dij()
{
priority_queue<HeapNode, vector<HeapNode>, greater<HeapNode> > heap;
dis[] = ;
heap.push(make_pair(, ));
while(!heap.empty())
{
pair<int, int>T = heap.top();
heap.pop(); if(T.first != dis[T.second]) continue; for(int i = head[T.second]; i != -; i = G[i].nxt)
{
int v = G[i].v;
if(dis[v] > dis[T.second] + G[i].w)
{
dis[v] = dis[T.second] + G[i].w;
heap.push(make_pair(dis[v], v));
}
}
}
} int main()
{
int a, b, c;
while(~scanf("%d%d", &N, &M))
{
if(N == && M == ) break;
init();
while(M--)
{
scanf("%d%d%d", &a, &b, &c);
add(a, b, c);
add(b, a, c);
} dij();
printf("%d\n", dis[N]);
} return ;
}
最短路算法 —— Dijkstra算法的更多相关文章
- 最短路径算法-Dijkstra算法的应用之单词转换(词梯问题)(转)
一,问题描述 在英文单词表中,有一些单词非常相似,它们可以通过只变换一个字符而得到另一个单词.比如:hive-->five:wine-->line:line-->nine:nine- ...
- 最短路和次短路问题,dijkstra算法
/* *题目大意: *在一个有向图中,求从s到t两个点之间的最短路和比最短路长1的次短路的条数之和; * *算法思想: *用A*求第K短路,目测会超时,直接在dijkstra算法上求次短路; ...
- (转)最短路算法--Dijkstra算法
转自:http://blog.51cto.com/ahalei/1387799 上周我们介绍了神奇的只有五行的Floyd最短路算法,它可以方便的求得任意两点的最短路径,这称为“多源最短 ...
- 单源最短路:Dijkstra算法 及 关于负权的讨论
描述: 对于图(有向无向都适用),求某一点到其他任一点的最短路径(不能有负权边). 操作: 1. 初始化: 一个节点大小的数组dist[n] 源点的距离初始化为0,与源点直接相连的初始化为其权重,其他 ...
- HDOJ 2544 最短路(最短路径 dijkstra算法,SPFA邻接表实现,floyd算法)
最短路 Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submis ...
- [Swust OJ 842]--实验室和食堂(最短路,Dijkstra算法)
题目链接:http://acm.swust.edu.cn/problem/842/ Time limit(ms): 1000 Memory limit(kb): 10000 Description ...
- 最短路-Prim算法 dijkstra算法
HDU-1233 #include <iostream> #define INF 1000000 using namespace std; ][]; ]; ]; ]; ]; int mai ...
- HDU1535——Invitation Cards(最短路径:SPAF算法+dijkstra算法)
Invitation Cards DescriptionIn the age of television, not many people attend theater performances. A ...
- 《算法导论》读书笔记之图论算法—Dijkstra 算法求最短路径
自从打ACM以来也算是用Dijkstra算法来求最短路径了好久,现在就写一篇博客来介绍一下这个算法吧 :) Dijkstra(迪杰斯特拉)算法是典型的最短路径路由算法,用于计算一个节点到其他所有节点的 ...
- 最小生成树(prime算法 & kruskal算法)和 最短路径算法(floyd算法 & dijkstra算法)
一.主要内容: 介绍图论中两大经典问题:最小生成树问题以及最短路径问题,以及给出解决每个问题的两种不同算法. 其中最小生成树问题可参考以下题目: 题目1012:畅通工程 http://ac.jobdu ...
随机推荐
- android点击桌面App图标activity启动流程
1.点击桌面App图标,Launcher进程采用Binder IPC向system_server进程发起startActivity请求:2.system_server进程接收到请求后,向zygote进 ...
- URL篇之不安全字符处理
URL是可移植的.它要统一命名因特网上的所有资源,就需要通过各种不同的协议来传送这些资源.这些协议在传输数据时会使用不同的机制,所以,设计URL,使其可以通过任意因特网协议安全地传输是很重要的. UR ...
- TimesTen启动停止命令
ttDaemonAdmin –start 启动 ttDaemonAdmin –stop 停止 或打开服务cmd-serviers.msc,找到相关服务启动或停止.
- 阿里云centos 7 中tomcat 自启动
这里我的tomcat的安装路径为 /usr/local/tomcat 1 为tomcat添加自启动参数 catalina.sh在执行的时候会调用同级路径下的setenv.sh来设置额外的环境变量,因此 ...
- 深度学习(五)基于tensorflow实现简单卷积神经网络Lenet5
原文作者:aircraft 原文地址:https://www.cnblogs.com/DOMLX/p/8954892.html 参考博客:https://blog.csdn.net/u01287127 ...
- Understanding Java 8 Streams API---reference
http://java.amitph.com/2014/01/understanding-java-8-streams-api.html Since past few versions, Java h ...
- D3(v5) in TypeScript 坐标轴之 scaleBand用法
在学习d3时候,发现在TS中实现D3的坐标轴中遇到一些错误,而这些错误却不会存在于js(因为ts的类型检查)写法中,因此做下笔记: import * as d3 from 'd3';import * ...
- c# 文件名排序
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.C ...
- Thrift笔记(一)--Hello Demo
Thrift是一个RPC框架 1. 用IDL定义好实体和服务框架,如实体字段名,类型等.服务名,服务参数,返回值等 2. 通过编译器或者说代码生成器生成RPC框架代码 IDL语法,代码生成器的安装使用 ...
- Backbone事件机制核心源码(仅包含Events、Model模块)
一.应用场景 为了改善酷版139邮箱的代码结构,引入backbone的事件机制,按照MVC的分层思想搭建酷版云邮局的代码框架.力求在保持酷版轻量级的基础上提高代码的可维护性. 二.遗留问题 1.b ...