SPFA+邻接表
2014-08-12 11:24
85 查看
#include <stdio.h> #include <cstring> #include <iostream> #include <algorithm> #include <queue> using namespace std; const int maxn=300001; const int inf =0x7ffffff; struct edge { int from,to,w,next; }e[1000001]; int head[maxn]; int vis[maxn]; int path[maxn]; int dist[maxn]; int n,m,t; void add(int i,int j,int w) { e[t].from=i; e[t].to=j; e[t].w=w; e[t].next=head[i]; head[i]=t++; } void spfa(int s) { queue <int> q; for(int i=0;i<n;i++) { dist[i]=inf; path[i]=s; } memset(vis,false,sizeof(vis)); q.push(s); dist[s]=0; while(!q.empty()) { int u=q.front(); q.pop(); vis[u]=false; for(int i=head[u];i!=-1;i=e[i].next) { int v=e[i].to; if(dist[v]>dist[u]+e[i].w) { dist[v]=dist[u]+e[i].w; path[v]=u; if(!vis[v]) { vis[v]=true; q.push(v); } } } } } int main() { int a,b,c,s,e; int i,j; int shortest[maxn]; scanf("%d",&n); t=0; memset(head,-1,sizeof(head)); while(1) { scanf("%d%d%d",&a,&b,&c); if(a==-1&&b==-1&&c==-1) break; add(a,b,c); } spfa(0); for(i=1;i<n;i++) { printf("%d\t",dist[i]); memset(shortest,0,sizeof(shortest)); int k=0; shortest[k]=i; while(path[shortest[k]]!=0) { k++; shortest[k]=path[shortest[k-1]]; } k++; shortest[k]=0; for(j=k;j>0;j--) printf("%d->",shortest[j]); printf("%d\n",shortest[j]); } return 0; }
相关文章推荐
- SPFA 邻接表模式
- poj 1511 Invitation Cards(SPFA)(矩阵以及邻接表对比)
- 【SPFA】邻接表 + SPFA 快的无法吐槽(才怪)
- 最短路 + 邻接表 + 堆优化(模板)(Dijkstra + SPFA)
- HDOJ 2544 最短路(最短路径 dijkstra算法,SPFA邻接表实现,floyd算法)
- hdu 1535 Invitation Cards(邻接表spfa)
- HDU1535~Invitation Cards(spfa+邻接表反转)
- SPFA 邻接表模式
- HDU 2544 最短路 floyd djkstra(邻接表,邻接矩阵) spfa bellman-ford 模板题
- POJ 3159-Candies(差分约束系统-SPFA+邻接表)
- HDU 2544 最短路(spfa邻接表)
- 最小费用流算法模板--SPFA(邻接表)
- 最短路模板——dijkstra,SPFA(邻接表实现)
- POJ-3259-Wormholes(SPFA 链表建立邻接表)
- SPFA 邻接表模式
- 旧代码 - 最短路 Spfa(邻接表)
- HDU 1535 Invitation Cards 有向图的来回最短路(邻接表反向建图)+spfa
- Constructing Roads(SPFA+邻接表)
- 最小费spfa()+ek() 邻接表
- Poj(2679),SPFA,邻接表(主流写法)