单源最短路(dijkstra)
来源:互联网 发布:nginx php 500错误 编辑:程序博客网 时间:2024/05/17 15:17
题目: 给定n个点,m条边,以及每条边的信息,求从源点1到终点n的最短距离。
思路:每次找一个顶点(集合外)加入S集合(已经求出当前最短路的集合),可加入条件为 dist[u]+cost<dist[v] 。dist[i] 为从1到 i 的最短距离。使用优先队列存图信息,复杂度达到 O(ElogE) 。
代码:
#include <bits/stdc++.h>using namespace std;/* * 使用优先队列优化Dijkstra算法 * 复杂度O(ElogE) * 注意对vector<Edge>E[MAXN]进行初始化后加边 */const int INF=0x3f3f3f3f;const int MAXN=1000010;struct qnode{ int v; int c; qnode(int _v=0,int _c=0):v(_v),c(_c){} bool operator <(const qnode &r)const { return c>r.c; }};struct Edge{ int v,cost; Edge(int _v=0,int _cost=0):v(_v),cost(_cost){}};vector<Edge>E[MAXN];bool vis[MAXN];int dist[MAXN];void Dijkstra(int n,int start)//点的编号从1开始{ memset(vis,false,sizeof(vis)); for(int i=1;i<=n;i++)dist[i]=INF; priority_queue<qnode>que; while(!que.empty())que.pop(); dist[start]=0; que.push(qnode(start,0)); qnode tmp; while(!que.empty()) { tmp=que.top(); que.pop(); int u=tmp.v; if(vis[u])continue; vis[u]=true; for(int i=0;i<E[u].size();i++) { int v=E[tmp.v][i].v; int cost=E[u][i].cost; if(!vis[v]&&dist[v]>dist[u]+cost) { dist[v]=dist[u]+cost; que.push(qnode(v,dist[v])); } } }}void addedge(int u,int v,int w){ E[u].push_back(Edge(v,w));}int main(){ int n,m; int T; scanf("%d",&T); while(T--) { scanf("%d%d",&n,&m); for(int i=1;i<=n;i++)E[i].clear(); for(int i=0;i<m;i++) { int u,v,w; scanf("%d%d%d",&u,&v,&w); addedge(u,v,w); //addedge(v,u,w);无向图 } Dijkstra(n,1); //单源最短路,dist[i]为从源点start到i的最短路 printf("%d\n",dist[n]); } return 0;}
测试数据:
1
5 6
1 2 4
2 3 5
1 3 2
3 5 8
3 4 1
4 5 2
输出:5
阅读全文
0 0
- 单源最短路(dijkstra)
- hdu 3790 (单源最短路dijkstra)
- poj3268(单源最短路,dijkstra算法)
- Dijkstra算法---单源最短路(基础模板)
- Dijkstra算法(单源最短路问题)
- Dijkstra单源最短路,邻接矩阵形式(模板)
- POJ 1502 单源最短路(Dijkstra算法)
- 单源最短路问题(dijkstra算法)
- 单源最短路(Dijkstra)邻接表实现
- dijkstra单源最短路(热浪codevs1557)
- 单源最短路(堆优dijkstra)
- 单源最短路dijkstra算法
- 单源最短路(Dijkstra)-poj1502
- dijkstra单源最短路
- 单源最短路Dijkstra
- Dijkstra-算法-----单源最短路
- Dijkstra 算法 -单源最短路
- hdu1874 单源最短路Dijkstra
- ubuntu下安装docker-compose
- Android studio 默认安装路径
- html的jQuery判断格式和从文本框获取信息放入表格
- 卷积神经网络应用:基于Tensorflow的CNN/CRF图像分割技术
- 关于同步异步、阻塞非阻塞的一些回答(简明扼要,准确精辟)
- 单源最短路(dijkstra)
- 横向滑动
- VLC RTSP视频播放终极解决方案
- JavaScript 隐式转换
- 1、JQuery——选择器
- C++ 对象模型--1小窥
- vue中关于computed的理解及其其他扩展
- 简述mybatis和hibernate的区别
- s5pv210-Linux驱动之USB鼠标