标签:最短路径 begin with lines desc sel 路径 class ted
5 1 5 3 3 1 2 5 0
3
电梯仅仅有两个方向,向上或者向下。既然是求最短路径。也就用到dijkstra算法(无负权值)。
仅仅要能想到怎样构造算法即可。假设自己的算法,却不知道怎样用来解题,也都是没用的。
在这里我想给大家说一下。
在以后做题的过程中,不要仅仅看别人的代码,要看思想,别人为什么这样写。然后依据自己想象的思想写一遍代码。写的过程中不要
看别人的代码。即使不正确也无所谓,这样印象最深,以后也就随手敲来、
详细还是代码里面见:
#include <stdio.h>
#include<string.h>
#include <queue>
using namespace std;
struct node
{
int pos,t;
friend bool operator<(node a,node b)
{
return a.t>b.t;
}
};
priority_queue<node>s;
int lift[205],vis[205],n;
int dijkstra(int st,int ed)
{
node temp,temp1;
int flag=0;
temp.pos=st,temp.t=0;
s.push(temp);
while(!s.empty())
{
temp1=temp=s.top(),s.pop();
vis[temp.pos]=1;
if(temp.pos==ed)
{
flag=1;
break;
}
temp.pos=temp1.pos-lift[temp1.pos];//
temp.t=temp1.t+1;
if(temp.pos>=1&&temp.pos<=n&&!vis[temp.pos])
s.push(temp);
temp.pos=temp1.pos+lift[temp1.pos];
temp.t=temp1.t+1;
if(temp.pos>=1&&temp.pos<=n&&!vis[temp.pos])
s.push(temp);//和以往的代码不同的也就这个地方。曾经做的要么是个矩阵,要么是个树,如今就两个方向了。。推断电梯的这两个方向,进队列即可了
}
if(flag)
return temp.t;
else
return -1;
}
int main()
{
int st,ed;
while(scanf("%d",&n)!=EOF)
{
if(n==0)
break;
scanf("%d %d",&st,&ed);
for(int i=1;i<=n;i++)
scanf("%d",&lift[i]);
memset(vis,0,sizeof(vis));
while(!s.empty())
s.pop();
printf("%d\n",dijkstra(st,ed));
}
return 0;
} hdu1584 A strange lift (电梯最短路径问题)
标签:最短路径 begin with lines desc sel 路径 class ted
原文地址:http://www.cnblogs.com/yangykaifa/p/7267052.html