差分约束系统 Dijkstra模板(2)
来源:互联网 发布:哪个软件可以打双色 编辑:程序博客网 时间:2024/06/10 15:08
/**差分约束 Dijkstra 模板(数组)这题用vector会超时,后来才知道这个叫链式前向星差分约束感觉这个博客写的比较好:http://blog.csdn.net/xuezhongfenfei/article/details/8685313**/#include <iostream>#include <cstring>#include <cstdio>#include <vector>#include <queue>#include <stack>using namespace std;const int INF=1<<27;const int maxn=30005;struct HeapNode//优先队列的节点{ int d,u; bool operator < (const HeapNode& rhs) const { return d>rhs.d; }};struct Edge{ int next,to,dist; //next表示从同一个点出发相邻的边}edges[150005];struct Dijkstra{ int n,m,total;//点数和边数 int head[maxn]; //每个点出发的边编号(从0开始编号) bool done[maxn]; //是否已经永久标号 int d[maxn]; //s到各个点之间的距离 int p[maxn]; //最短路中的上一条边 void init(int n) { this->n=n; memset(head,-1,sizeof(head)); total=0; } void AddEdge(int from,int to,int dist) { edges[total].to=to; edges[total].dist=dist; edges[total].next=head[from]; head[from]=total++; } void dijkstra(int s)//求s到所有点的距离 { priority_queue<HeapNode> Q; for(int i=0;i<n;i++) d[i]=INF; d[s]=0; memset(done,0,sizeof(done)); Q.push((HeapNode){0,s}); while(!Q.empty()) { HeapNode x=Q.top(); Q.pop(); int u=x.u; if(done[u]) continue; done[u]=true; for(int i=head[u];i!=-1;i=edges[i].next) { Edge& e=edges[i]; if(d[e.to]>d[u]+e.dist) { d[e.to]=d[u]+e.dist; p[e.to]=u; Q.push((HeapNode){d[e.to],e.to}); } } } }};int main(){ int n,m,i,x,y,z; Dijkstra solver; scanf("%d%d",&n,&m); solver.init(n); for(i=0;i<m;i++) { scanf("%d%d%d",&x,&y,&z); solver.AddEdge(x-1,y-1,z); } solver.dijkstra(0); printf("%d\n",solver.d[n-1]); return 0;}
0 0
- 差分约束系统 Dijkstra模板(2)
- 差分约束系统【模板】
- 差分约束系统【模板】
- [模板] 差分约束系统
- 差分约束系统模板
- POJ3159 最大差距(差分约束系统 ,Dijkstra+Heap)
- 差分约束 模板
- 差分约束模板
- 区间(差分约束模板)
- 差分约束系统
- 差分约束系统
- 差分约束系统
- 差分约束系统
- 差分约束系统
- 差分约束系统
- 差分约束系统
- 差分约束系统
- 【差分约束系统】
- 虚析构函数
- go 协程与主线程强占运行
- 一分钟带你完美安装Mongodb
- android 多渠道打包
- iOS框架集合
- 差分约束系统 Dijkstra模板(2)
- 常用 dpkg-reconfigure 用法
- 安卓JNI/NDK开发1(开发前了解)
- 抽象类与接口的区别与联系
- 网站受DDoS攻击的表现以及查看方法
- centos7可用第三方源安装php5.6
- [Ruby] inject的使用
- Arduino UNO R3面板接口的介绍----记录学习Arduino
- ListView的getCheckedItemIds()方法