博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
模板 - 图论 - 单源最短路
阅读量:4980 次
发布时间:2019-06-12

本文共 1696 字,大约阅读时间需要 5 分钟。

第一次用Markdown编辑器写博文呢。

单源最短路的模板,链式前向星写法。

非负权的单源最短路Dijkstra算法。

Dijkstra

#include
using namespace std;const int INF=0x3f3f3f3f;/* begin 链式前向星 */const int MAXN=1000010;const int MAXM=2000010;struct Edge{ int v,w,next; Edge(int v=0,int w=0):v(v),w(w){}};int cnt_edge;int head[MAXN+5];Edge edge[MAXM+5];inline void init_graph(int n){ cnt_edge=0; memset(head+1,0,sizeof(head[0])*n);}inline void add_edge(int u,int v,int w){ cnt_edge++; edge[cnt_edge].v=v; edge[cnt_edge].w=w; edge[cnt_edge].next=head[u]; head[u]=cnt_edge;}/* end 链式前向星 *//* begin Dijkstra */bool vis[MAXN+5];int dis[MAXN+5];struct Edge_node{ int v,w; Edge_node(int v=0,int w=0):v(v),w(w){} bool operator<(const Edge_node &e)const { return w>e.w; }};void Dijkstra(int n,int s){ memset(vis+1,0,sizeof(vis[0])*n); for(int i=1;i<=n;i++) dis[i]=INF; priority_queue
pq; dis[s]=0; pq.push(Edge_node(s,0)); while(!pq.empty()){ int u=pq.top().v; pq.pop(); if(vis[u])continue; vis[u]=1; for(int i=head[u];i;i=edge[i].next){ int &v=edge[i].v; int &w=edge[i].w; if(!vis[v]&&dis[v]>dis[u]+w){ dis[v]=dis[u]+w; pq.push(Edge_node(v,dis[v])); } } }}/* end Dijkstra */int main(){ int n,m,s; while(~scanf("%d%d%d",&n,&m,&s)){ init_graph(n); for(int i=1;i<=m;i++){ int u,v,w; scanf("%d%d%d",&u,&v,&w); add_edge(u,v,w); } Dijkstra(n,s); for(int i=1;i<=n;i++){ printf("%d%c",dis[i]," \n"[i==n]); } }}

转载于:https://www.cnblogs.com/Yinku/p/10575322.html

你可能感兴趣的文章
10-4. 字符串循环左移(20)
查看>>
一个js验证类
查看>>
CListUI控件的认识
查看>>
通过单元测试理解spring容器以及dubbo+zookeeper单元测试异常处理
查看>>
接口测试自动化框架搭建
查看>>
IDEA如何打包可运行jar的一个问题
查看>>
单例模式的八种写法比较
查看>>
Gatling的进阶三
查看>>
世界虐狗日——2.14
查看>>
MongoDB权威指南
查看>>
1.5坐标系
查看>>
求3个数公倍数
查看>>
总结sql中in和as的用法
查看>>
2017.8.23 postgresql的外键
查看>>
数据库的多表查询及左右连接
查看>>
codevs 5565 二叉苹果树 树形DP
查看>>
无人机系统开发
查看>>
js --基本语法3 函数,数组,堆棧
查看>>
ngx_pagespeed-nginx前端优化模块介绍
查看>>
linux负载均衡总结性说明(四层负载/七层负载)
查看>>