您的位置:首页 > 其它

HDU 1548 A strange lift

2012-09-03 21:00 253 查看
本以为可以用简单的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

,d
;
bool s
;
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;
}





                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: