poj 2457 Part Acquisition dij

dij+记录路径

View Code
#include <stdio.h>
#define inf 0x3f3f3f3f

int k,n,path[1005],dis[1005],map[1005][1005];

void dij()
{
int i,j,min,minj,vis[1005];
for (i=1;i<=k;i++)
{
dis[i]=map[1][i];
vis[i]=0;
path[i]=i;
}
vis[i]=1;
for (i=2;i<=k;i++)
{
for (j=1,min=inf;j<=k;j++)
{
if(!vis[j]&&dis[j]<min)
{
min=dis[j];
minj=j;
}
}
vis[minj]=1;
for (j=1;j<=k;j++)
{
if(!vis[j]&&dis[j]>dis[minj]+map[minj][j])
{
dis[j]=dis[minj]+map[minj][j];
path[j]=minj;
}
}
}
}

void f()
{
int i=1,j,x=k,ans[1005];
ans[0]=k;
while (path[x]!=x)
{
ans[i++]=path[x];
x=path[x];
}
printf("%d\n",i+1);
ans[i]=1;
for (j=i;j>=0;j--)
printf("%d\n",ans[j]);
}

int main()
{
int i,j,a,b;
scanf("%d%d",&n,&k);
for (i=0;i<=k;i++)
{
for (j=0;j<=k;j++)
map[i][j]=inf;
}
for (i=0;i<n;i++)
{
scanf("%d%d",&a,&b);
map[a][b]=1;
}
dij();
if(dis[k]>=inf)printf("-1\n");
else f();
return 0;
}



posted @ 2011-11-26 20:55  104_gogo  阅读(242)  评论(0)    收藏  举报