【模板】迪杰斯特拉的优先队列优化
2017-07-15 16:06
204 查看
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<queue> using namespace std; const int SIZE=100010; int head[SIZE],n,m,s,ecnt,dis[SIZE]; bool vis[SIZE]; struct node { int id,w; }; struct edge { int v,nxt,dist; }e[SIZE]; bool operator <(node a,node b) { return (a.w>b.w); } void add_edge(int from,int to,int dis) { e[++ecnt]=(edge){to,head[from],dis}; head[from]=ecnt; } void dijkstra(int u) { memset(dis,0x3f,sizeof(dis)); memset(vis,0,sizeof(vis)); priority_queue<node>q; dis[u]=0; q.push((node){u,0}); while(!q.empty()) { node flag=q.top(); q.pop(); int v=flag.id; 4000 if(vis[v]) continue; vis[v]=1; for(int i=head[v];i;i=e[i].nxt) { int to=e[i].v; if(dis[to]>dis[v]+e[i].dist) { dis[to]=dis[v]+e[i].dist; q.push((node){to,dis[to]}); } } } } int main() { scanf("%d%d%d",&n,&m,&s); for(int i=1,x,y,z;i<=m;i++) { scanf("%d%d%d",&x,&y,&z); add_edge(x,y,z); add_edge(y,x,z); } dijkstra(s); for(int i=1;i<=n;i++) printf("%d ",dis[i]); return 0; }
相关文章推荐
- usaco Sweet Butter(迪杰斯特拉(优先队列优化),bellman_ford算法模板)
- 迪杰斯特拉+优先队列优化
- sicily 1031. Campus (优先队列优化的dijistra模板)
- 最短路算法模板合集(Dijkstar,Dijkstar(优先队列优化), 多源最短路Floyd)
- dijkstra算法模板(优先队列优化)
- 【讲解 + 模板】Dijkstra迪杰斯特拉+堆优化
- UVa 10635(lcs转lis优化模板)王子和公主
- bzoj4161: Shlw loves matrixI【特征多项式优化常系数齐次线性递推模板】
- 优化后的01背包模板
- 用DIV+CSS5 优化后的HTML结构(可用于每次新建HTML模板):
- cocos2dx-vs模板孤狼优化版V1.4
- 【模板】Dijkstra+前向星+堆优化 (模板题:洛谷P3371)
- 博客园模板 样式优化
- Dijkstra模板(优先队列)
- HDU 3790 最短路径问题(迪杰斯特拉/优先队列/最短路)
- C++读入优化模板
- 模板 图论 Dijkstra+堆优化
- Dijkstra 优先队列优化
- [模板] 斜率优化Dp详解
- 高精度模板 (进制优化)