dijkstra algorithm 模板(showpath)
来源:互联网 发布:hey软件 编辑:程序博客网 时间:2024/06/06 02:20
//未使用优先队列,时间复杂度为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;
}
阅读全文
0 0
- dijkstra algorithm 模板(showpath)
- Dijkstra algorithm.
- dijkstra algorithm
- Dijkstra算法(Dijkstra's algorithm)
- showpath.c
- Dijkstra Algorithm 算法详解
- Dijkstra\'s Algorithm
- Dijkstra's Algorithm
- Dijkstra's algorithm
- 图算法 -- Dijkstra Algorithm
- Dijkstra Algorithm 实现
- Dijkstra's Algorithm
- dijkstra 模板
- dijkstra 模板
- Dijkstra模板
- dijkstra模板
- dijkstra模板
- Dijkstra模板
- POJ 2002.Squares
- Java 工具
- 在使用Recyclerview加载列表圆形图片时出现的滑动卡顿及图片混乱问题
- 计算机网络之文件传送协议FTP
- C# 获取文件的修改时间、访问时间、创建时间
- dijkstra algorithm 模板(showpath)
- Uncaught SyntaxError: Invalid or unexpected token 报错
- OSC 十月新增开源项目:号称最快的 Node.js 应用框架来了
- Sobel边缘检测算法
- 删除centos7开机界面多余选项
- 程序如何区分该显示中文字符或英语字符?
- Swift 文章链接
- 阿里云视频点播指定清晰度
- ppt资源的拖动插入方法