POJ 3159 Candies(差分约束+dijkstra)
2016-11-20 09:15
260 查看
根据B-A<=C可以从A连一条权值为C的边,然后从差分式子中可以看出这是求最短路,因为没有负权边,所以用dijkstra更快,但是vector建图会超时,所以用前向星建图。
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<vector> #include<queue> using namespace std; const int maxn=30000+5; const int maxc=150000+5; const int inf=100000000; struct HeapNode{ int d,u; bool operator < (const HeapNode &rhs) const { return d>rhs.d; } }; struct edge{ int from,to,dist; }; struct Dijkstra{ int n,m; edge edges[maxc]; int head[maxc]; int next[maxc]; bool done[maxn]; int d[maxn]; int p[maxn]; void init(int n){ this->n=n; memset(head,-1,sizeof(head)); memset(next,-1,sizeof(next)); } void addedge(int from,int to,int dist){ edges[m]=(edge){from,to,dist}; next[m]=head[from]; head[from]=m++; } void dijkstra(int s){ priority_queue<HeapNode> pq; for(int i=0;i<n;i++) d[i]=inf; d[s]=0; pq.push((HeapNode){0,s}); memset(done,0,sizeof(done)); while(!pq.empty()){ HeapNode x=pq.top();pq.pop(); int u=x.u; if(done[u]) continue; done[u]=true; for(int i=head[u];i!=-1;i=next[i]){ edge &e=edges[i]; if(d[e.to]>d[u]+e.dist){ d[e.to]=d[u]+e.dist; p[e.to]=i; pq.push((HeapNode){d[e.to],e.to}); } } } } }; Dijkstra dij; int n,m; int main() { while(~scanf("%d%d",&n,&m)) { dij.init(n); int u,v,dist; for(int i=0;i<m;i++){ scanf("%d%d%d",&u,&v,&dist); u--;v--; dij.addedge(u,v,dist); } dij.dijkstra(0); printf("%d\n",dij.d[n-1]); } return 0; }
相关文章推荐
- POJ 3159 Candies
- poj_3159_Candies
- poj 3159 -- Candies ( spfa + 栈 )
- poj 3159 Candies 差分约束 + spfa
- poj 3159 candies
- POJ3159——Candies
- POJ-3159 Candies 最短路应用(差分约束)
- POJ 3159 Candies 差分约束
- POJ 3159 Candies
- poj3159——Candies(差分约束+SPFA堆栈)
- POJ 3159 Candies(差分约束系统)
- poj 3159 Candies
- poj 3159 Candies------spfa算法
- Candies(POJ 3159)(无负权边的带权有向图或无向图的单源最短路)(Dijkstra)
- POJ 3159 Candies
- poj 3159 Candies
- POJ-3159-Candies
- poj 3159 Candies 【简单差分约束】 【SPFA + 数组模拟栈】
- POJ 3159 Candies 差分约束-SPFA栈实现
- POJ 3159 Candies 解题报告(Dijkstra & SPFA) 及 双向Dijkstra性能测试