您的位置:首页 > 产品设计 > UI/UE

poj 2457 Part Acquisition最短路径dijikstra迪杰斯特拉

2017-03-15 20:40 363 查看
题目地址:http://poj.org/problem?id=2457

题目给出的是哪里到哪里可以走,没给出距离,我们假设为距离全为1,不通的路即为无穷。用path【】数组记录前驱路径。

路径的输出用递归

#include<stdio.h>
#define INF 0xfffffff
int n,k;
int map[11000][11000];
int len[11000],vis[11000];//分别记录距离和访问记录
int path[10100]; //记录前驱路径

void map_0() //数组初始化
{
for(int i=0;i<1001;i++)
for(int j=0;j<1001;j++)
{
map[i][j]=INF;
vis[j]=0;
len[j]=INF;
path[j]=-1;
}

}
void output(int c,int count)
{
if(c<=1)
{
printf("%d\n1\n",count);
return ;
}
output(path[c],count+1);
printf("%d\n",c);
}

void dijkstra()
{
vis[1]=1;
while(1)
{
int min=INF;
int j=0;
for(int i=1;i<=k;i++)
{
if(vis[i]==0&&len[i]<min)
{ min=len[i];
j=i;
}
}
if(j==0)break;

vis[j]=1;
for(int i=1;i<=k;i++)
{
if(vis[i]==0&&len[i]>len[j]+map[j][i])
{
len[i]=len[j]+map[j][i];
path[i]=j;

}
}
}
}
int main()
{
while(scanf("%d%d",&n,&k)!=EOF)
{
map_0();
while(n--)
{
int a,b;
scanf("%d%d",&a,&b);
map[a][b]=1;

if(a==1)
{
len[b]=1;
path[b]=a;
}
}
dijkstra();
if(len[k]!=INF)
output(k,1);
else
puts("-1");
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: