dijkstra algorithm 模板(showpath)
2017-11-09 11:37
288 查看
//未使用优先队列,时间复杂度为O(v*v)
//dijkstra algorithm
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<stack>
using namespace std;
const int INF=100000;
const int maxn=200+5;
int G[maxn][maxn];
bool done[maxn];
int d[maxn];
int parent[maxn]; //路径
int v,e;
void dijkstra()
{
memset(done,false,sizeof(done));
for(int i=1;i<=v;i++)
d[i]=(i==1?0:INF);
for(int i=1;i<=v;i++)
{
int x,m=INF;
for(int y=1;y<=v;y++)
if(!done[y]&&d[y]<=m) m=d[x=y];
done[x]=true;
for(int y=1;y<=v;y++)
if(d[y]>d[x]+G[x][y])
{
d[y]=d[x]+G[x][y];
parent[y]=x;
}
}
}
int main()
{
while(scanf("%d%d",&v,&e)==2&&v)
{
for(int i=1;i<=v;i++)
for(int j=1;j<=v;j++)
if(i==j) G[i][j]=0;
else G[i][j]=INF;
for(int i=0;i<e;i++)
{
int v1,v2,dist;
scanf("%d%d%d",&v1,&v2,&dist);
if(G[v1][v2]>dist) G[v1][v2]=dist;
//避免重边的情况
}
dijkstra();
int end;
while(scanf("%d",&end)==1&&end>=1&&end<=v)
{
if(d[end]>=INF) printf("No path.\n");
else {
printf("%d\n",d[end]);
stack<int>path;
int x=end;
while(x!=1)
{
path.push(x);
x=parent[x];
}
path.push(1);
while(!path.empty())
{
printf("%d ",path.top());
path.pop();
}
printf("\n");
}
}
}
return 0;
}
//dijkstra algorithm
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<stack>
using namespace std;
const int INF=100000;
const int maxn=200+5;
int G[maxn][maxn];
bool done[maxn];
int d[maxn];
int parent[maxn]; //路径
int v,e;
void dijkstra()
{
memset(done,false,sizeof(done));
for(int i=1;i<=v;i++)
d[i]=(i==1?0:INF);
for(int i=1;i<=v;i++)
{
int x,m=INF;
for(int y=1;y<=v;y++)
if(!done[y]&&d[y]<=m) m=d[x=y];
done[x]=true;
for(int y=1;y<=v;y++)
if(d[y]>d[x]+G[x][y])
{
d[y]=d[x]+G[x][y];
parent[y]=x;
}
}
}
int main()
{
while(scanf("%d%d",&v,&e)==2&&v)
{
for(int i=1;i<=v;i++)
for(int j=1;j<=v;j++)
if(i==j) G[i][j]=0;
else G[i][j]=INF;
for(int i=0;i<e;i++)
{
int v1,v2,dist;
scanf("%d%d%d",&v1,&v2,&dist);
if(G[v1][v2]>dist) G[v1][v2]=dist;
//避免重边的情况
}
dijkstra();
int end;
while(scanf("%d",&end)==1&&end>=1&&end<=v)
{
if(d[end]>=INF) printf("No path.\n");
else {
printf("%d\n",d[end]);
stack<int>path;
int x=end;
while(x!=1)
{
path.push(x);
x=parent[x];
}
path.push(1);
while(!path.empty())
{
printf("%d ",path.top());
path.pop();
}
printf("\n");
}
}
}
return 0;
}
相关文章推荐
- Dijkstra's Shortest-Path Algorithm Implementation(TODO)
- Dijkstra's Algorithm of shortest path
- Dijkstra’s shortest path algorithm
- A Fast Priority Queue Implementation of the Dijkstra Shortest Path Algorithm
- Dijkstra's Shortest Path Algorithm(最短路径算法)
- Dijkstra's shortest path algorithm
- GeeksForGeeks-Dijkstra’s shortest path algorithm最短路径
- Method for finding shortest path to destination in traffic network using Dijkstra algorithm or Floyd-warshall algorithm
- 最短路模板(SPFA+dijkstra)
- poj 1502 MPI Maelstrom dijkstra基础 入门 点型模板题
- hdu 2544 最短路 dijkstra模板
- HDOJ题目2544 最短路(最短路径问题,Dijkstra模板)
- dijkstra模板
- 模板 Dijkstra
- [algorithm] A* Pathfinding for Beginners
- Dijkstra模板
- hdu-2544-最短路(Dijkstra + Dijkstra优先队列 + Bellman-ford + SPFA +Floyd) 纯模板题
- UVA - 11374 Airport Express (Dijkstra模板+枚举)
- 模板 图的遍历 bfs+dfs 图的最短路径 Floyed+Dijkstra
- BGP Best Path Selection Algorithm