HDU 1548 A strange lift

本以为可以用简单的dfs搜索过掉,但总WA;

看了牛人的思路,此题可以转化为dijkstra题来解;

对每一层的上下i+k[i]和i-k[i]合法,其路径长度置1;


#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int N=202;
const int INF=1<<29;
int path[N][N],d[N];
bool s[N];
void dijkstra(int a,int b,int n)
{
   int i,j,u;
   memset(s,0,sizeof(s));
   for(i=1;i<=n;i++)
	   d[i]=path[a][i];
   d[a]=0;s[a]=1;
    for(i=0;i<n;i++)
	{
	   int temp=INF;
	   for(j=1;j<=n;j++)
	      if(!s[j]&&d[j]<temp)
		     temp=d[u=j];
	   s[u]=1;
	   for(j=1;j<=n;j++)
	   {
	      if(!s[j]&&d[j]>d[u]+path[u][j])
			  d[j]=d[u]+path[u][j];
	   }
	}
}
int main()
{
   int i,j,n,a,b,k;
   while(scanf("%d",&n)!=EOF&&n)
   {
       scanf("%d%d",&a,&b);
	   for(i=1;i<=n;i++)
	     for(j=1;j<=n;j++)
                path[i][j]=INF;//初始化;
	   for(i=1;i<=n;i++)
	   {
		   scanf("%d",&k);
	      if((i+k)<=n) path[i][i+k]=1;//press up;
		  if((i-k)>=1) path[i][i-k]=1;//press down;
	   } 
	  dijkstra(a,b,n);
	  if(d[b]==INF) printf("-1\n");
      else printf("%d\n",d[b]);
   }
   return 0;
}




你可能感兴趣的:(HDU 1548 A strange lift)