hdu1548

/*
分析:
    第一次写最短路,1WA,考虑到a==b的情况了,但第一次错
误的输出了a,- -III,我的1A啊……


                                              2012-05-26
*/








#include"stdio.h"
#include"string.h"
struct A
{
	int ans;
	int flag;
	int pre;
}E[222];
int min(int a,int b)
{
	return a>b?b:a;
}
int main()
{
	int n;
	int a,b;
	int i,l;
	int temp;
	int k;
	int map[202][202];
	while(scanf("%d",&n),n)
	{
		scanf("%d%d",&a,&b);


		for(i=1;i<=n;i++)
		for(l=1;l<=n;l++)
			map[i][l]=0;
		for(i=1;i<=n;i++)
		{
			scanf("%d",&temp);
			if(i+temp<=n)	map[i][i+temp]=1;
			if(i-temp>=1)	map[i][i-temp]=1;
		}


		if(a==b)	{printf("0\n");continue;}
		


		for(i=1;i<=n;i++)
		{
			E[i].ans=11111111;
			E[i].pre=i;
			E[i].flag=1;
		}


		k=a;
		E[k].ans=0;
		while(k)
		{
			E[k].flag=0;
			for(l=1;l<=n;l++)
			{
				if(map[k][l]==0)	continue;
				if(E[k].ans+map[k][l]<E[l].ans)
				{
					E[l].ans=E[k].ans+map[k][l];
					E[l].pre=k;
				}
			}


			k=0;
			for(l=1;l<=n;l++)	if(E[l].flag)	{k=l;break;}
			for(l++;l<=n;l++)	if(E[l].flag&&E[l].ans<E[k].ans)	k=l;
			if(E[k].ans==11111111)	break;
		}
		
		if(E[b].pre==b)	printf("-1\n");
		else			printf("%d\n",E[b].ans);
	}
	return 0;
}


你可能感兴趣的:(IE)