USACO传送门|二维SPFA
2015-10-13 20:57
323 查看
二维SPFA模板,需要的可以学习一下,原创
//BY genskyuine
//BY genskyuine
#include<cstdio> #include<cstring> #include<queue> using namespace std; const int MAXN=10010; const int MAXM=50010; int n,m,k,tot; int dis[MAXN][25],h[MAXN]; bool vis[MAXN][25]; struct Edge{ int v,w,next; }e[MAXM<<1]; struct Point{ int dis,id,step; bool friend operator<(Point a,Point b) { return a.dis>b.dis; } }last,now; void add(int u,int v,int w) { e[++tot].v=v; e[tot].w=w; e[tot].next=h[u]; h[u]=tot; } void spfa(){ memset(dis,0x3f,sizeof(dis)); priority_queue<Point> q; last.id=1;last.dis=0;last.step=0; q.push(last); dis[last.id][last.step]=0;vis[last.id][last.step]=1; while(!q.empty()) { now=q.top(); q.pop(); vis[now.id][now.step]=0; for(int i=h[now.id];i;i=e[i].next) { if(dis[e[i].v][now.step]>dis[now.id][now.step]+e[i].w) { dis[e[i].v][now.step]=dis[now.id][now.step]+e[i].w; if(!vis[e[i].v][now.step]) { vis[e[i].v][now.step]=1; q.push((Point){dis[e[i].v][now.step],e[i].v,now.step}); } } if(now.step+1<=k&&dis[e[i].v][now.step+1]>dis[now.id][now.step]) { dis[e[i].v][now.step+1]=dis[now.id][now.step]; if(!vis[e[i].v][now.step+1]) { q.push((Point){dis[e[i].v][now.step+1],e[i].v,now.step+1}); vis[e[i].v][now.step+1]=1; } } } } } void init(){ int i,u,v,w; scanf("%d%d%d",&n,&m,&k); for(i=1;i<=m;++i) { scanf("%d%d%d",&u,&v,&w); add(u,v,w); add(v,u,w); } spfa(); int ans=0x7fffffff; for(i=0;i<=k;++i) if(ans>dis [i]) ans=dis [i]; printf("%d",ans); } int main(){ init(); }
相关文章推荐
- 初学图论-Kahn拓扑排序算法(Kahn's Topological Sort Algorithm)
- 初学图论-Bellman-Ford单源最短路径算法
- 初学图论-DAG单源最短路径算法
- 初学图论-Dijkstra单源最短路径算法
- 初学图论-Dijkstra单源最短路径算法基于优先级队列(Priority Queue)的实现
- 封装好的Folyd建图,C++源码
- LCA模板
- USACO 3.2.2:Stringsobits
- 图论学习笔记之一——Floyd算法
- USACO 3.1 Shaping Regions
- 【LCA】SPOJ QTREE2
- poj 3249 Test for Job 最长路
- HDU 2544
- Timus 1557 Network Attack DFS+各种各种...
- HDU1289 Tarjan-模板题
- Poj2638 网络流+最短路+二分答案
- Aizu1311 分层图最短路 (...大概)
- 【解题报告】【USACO】酸奶工厂
- HDU 3631 Shortest Path
- 二分图匹配模板