dijkstra堆优化模板
2016-06-18 23:24
337 查看
#include<iostream> #include<cmath> #include<algorithm> #include<cstring> #include<cstdio> #include<queue> #define inf 2147483647 using namespace std; struct data { int from,to,next,w; data(){from=-1,to=-1,next=-1,w=-1;} }e[2000]; struct pa { int u,w; bool operator <(const pa& a)const { return w>a.w; } }; int n,m; int head[2000]; int d[2000],p[2000]; bool vis[2000]; int cnt=0; void add(int u,int v,int w){e[cnt].from=u,e[cnt].to=v;e[cnt].next=head[u],head[u]=cnt,e[cnt].w=w,cnt++;} void dijkstra(int s) { priority_queue<pa> q; for(int i=1;i<=n;i++) d[i]=inf; q.push((pa){s,0}); d[s]=0; memset(vis,0,sizeof(vis)); while(!q.empty()) { pa x=q.top(); q.pop(); if(vis[x.u]) continue; vis[x.u]=1; for(int i=head[x.u];i>=0;i=e[i].next) { if(d[e[i].to]>d[e[i].from]+e[i].w) { d[e[i].to]=d[e[i].from]+e[i].w; p[e[i].to]=i; q.push((pa){e[i].to,d[e[i].to]}); } } } } int main() { memset(head,-1,sizeof(head)); scanf("%d%d",&n,&m); for(int i=1;i<=m;i++) { int u,v,w; scanf("%d%d%d",&u,&v,&w); add(u,v,w); add(v,u,w); } int s,t; scanf("%d%d",&s,&t); dijkstra(s); cout<<d[t]; }
View Code
相关文章推荐
- 五子棋比赛程序对战平台
- Linux C 中断言assert()使用简介
- 多线程修改同一个数据
- 函数模板排序
- 最短路径:Shortest Reach
- 如何精确地测量java对象的大小
- 练习四 1009
- C++ IO流小结
- Git(1)
- Java 网络爬虫-htmlparser
- 程序解读
- 设计模式整理_单例设计模式
- 练习四 1006
- JQuery下focus()无法自动获取焦点的处理方法 jquery如何使文本框获得焦点
- JQuery下focus()无法自动获取焦点的处理方法 jquery如何使文本框获得焦点
- JQuery下focus()无法自动获取焦点的处理方法 jquery如何使文本框获得焦点
- JQuery下focus()无法自动获取焦点的处理方法 jquery如何使文本框获得焦点
- JQuery下focus()无法自动获取焦点的处理方法 jquery如何使文本框获得焦点
- JQuery下focus()无法自动获取焦点的处理方法 jquery如何使文本框获得焦点
- JQuery下focus()无法自动获取焦点的处理方法 jquery如何使文本框获得焦点