最短路模板(dijkstra+邻接表)
2014-07-23 20:41
351 查看
#include<iostream> #include<algorithm> #include<stdio.h> #include<stdlib.h> #include<string.h> #include<queue> #include<math.h> #include<set> #include<vector> using namespace std; #define maxn 550 #define MM 10000000 int V[maxn]; int d[maxn]; int fa[maxn]; int first[maxn],next[maxn],w[maxn],u[maxn],v[maxn]; int n,m; void read_() { //单向 or 双向均可~ scanf("%d%d",&n,&m); memset(first,-1,sizeof(first)); for(int i=1;i<=m;i++) { scanf("%d%d%d",&u[i],&v[i],&w[i]); next[i]=first[u[i]]; first[u[i]]=i; } //双向路径 for(int i=m+1;i<=2*m;i++) { u[i]=v[i-m]; v[i]=u[i-m]; w[i]=w[i-m]; next[i]=first[u[i]]; first[u[i]]=i; } } void Dijjkstra() { memset(V,0,sizeof(V)); memset(fa,0,sizeof(fa)); for(int i=1;i<=n;i++) d[i]=(i==1?0:MM); for(int i=1;i<=n;i++) { int x,mm=MM; for(int j=1;j<=n;j++) if(d[j]<mm && !V[j]) mm=d[x=j]; V[x]=1; for(int e=first[x];e!=-1;e=next[e]) { if(d[v[e]]>d[x]+w[e]) { d[v[e]]=d[x]+w[e]; fa[v[e]]=x; } } } } void dfs(int x ) //输出路径 { cout<<x<<endl; if(fa[x]==0) return; else { dfs(fa[x]); if(x==n) cout<<fa[x]; else cout<<fa[x]<<' '; } } int main() { read_(); Dijjkstra(); dfs(n); //输出路径:可更改终点值。 cout<<' '<<n<<endl; return 0; }其他的模板会陆续上传~
相关文章推荐
- 模板-最短路//Dilkstra
- 最短路(floyd/dijkstra/bellmanford/spaf 模板)
- 最短路 kruskal模板
- 【bzoj1726】 Usaco2006 Nov Roadblocks第二短路 次短路模板
- 【模板】最短路&&最小生成树
- 最短路之SPFA模板
- uva 11374 最短路+记录路径 dijkstra最短路模板
- UVA11374最短路模板
- 模板整理——图论·最短路·spfa
- HDU ~ 2544 ~ 最短路 (Dijkstra模板,常规版 and 优先队列优化版)
- 最短路【SPFA】算法模板
- 常见模板(欧拉筛素数,最小生成树,快排,并查集,单源最短路)
- 最短路模板:使用priority_queue实现的Dijkstra算法
- HDU1688 Sightseeing(SPFA 求最短路与次短路的路径条数)可用作模板
- 【单源最短路模板】 poj 2387
- 最短路~dijkstra堆优化模板
- 最短路 - - 模板
- 单源最短路 SPFA 算法模板
- POJ 3159 最短路dij优先队列模板 差分约束
- dijkstra 优先队列最短路模板