UVa 10801 Lift Hopping【floyd 】

题意:给出n个电梯,每个电梯的运行时间,每个电梯只能在相应的楼层停靠,而且没有楼梯,再给出想去的楼层,问从0层能否到达想去的楼层,求到达的最短时间

建图还是没有建出来---

因为n<100,可以用floyd

考虑到d[i][j]=min(d[i][j],d[i][k]+d[k][j])

d[i][k]+d[k][j],表示从第i层到达了第k层,又从第k层到达了第j层,说明在  k 层的时候换乘了电梯,需要加一个60

然后就是输入过程中,一直维护d[i][j]的最小值,更新的时候往上往下都要更新(因为电梯会往上运动和往下运动) 然后floyd就可以了

看的这一篇--http://mycodebattle.com/2014/08/UVa-10801/

 #include<iostream>
#include<cstdio>
#include<cstring>
#include <cmath>
#include<stack>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<algorithm>
using namespace std; #define foreach(i,c) for (__typeof(c.begin()) i = c.begin(); i != c.end(); ++i) typedef long long LL;
const int INF = 0x3f3f3f3f;
const int mod=;
const int maxn=; int d[maxn],f[maxn][maxn],t[maxn];
int n,en; int main(){
while(scanf("%d%d%*c",&n,&en)!=EOF){
memset(d,,sizeof(d));
memset(t,,sizeof(t));
for(int i=;i<maxn;i++){
for(int j=;j<maxn;j++){
if(i==j) f[i][j]=;
else f[i][j]=INF;
}
} for(int i=;i<n;i++) scanf("%d%*c",&t[i]); for(int i=;i<n;i++){
char ch=;
int j;
for( j=;ch!='\n';j++) scanf("%d%c",&d[j],&ch); for(int l=;l<j;l++){
for(int r=l+;r<j;r++){
int cur=f[d[l]][d[r]];
cur=min(cur,(d[r]-d[l])*t[i]);
f[d[r]][d[l]]=cur;//往上往下的值都要更新
f[d[l]][d[r]]=cur;
}
}
ch=;
} for(int k=;k<;k++)
for(int i=;i<;i++)
for(int j=;j<;j++)
f[i][j]=min(f[i][j],f[i][k]+f[k][j]+); if(f[][en]==INF) puts("IMPOSSIBLE");
else printf("%d\n",f[][en]);
}
return ;
}

这道题,先是因为自己的INF定义成(1<<30)-1;溢出了,改了好久

然后就是向上向下更新边,又wa了好久------------------

---------- 滚去吃饭了------------

g0000000000---------

上一篇:HTML(一)HTML基础语法(HTML简介,HTML文档声明)


下一篇:UVA 10801 Lift Hopping 最短路