您的位置:首页 > 运维架构

UVa 10801 Lift Hopping【floyd 】

2015-05-10 17:18 375 查看
题意:给出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=1000000007;
const int maxn=105;

int d[maxn],f[maxn][maxn],t[maxn];
int n,en;

int main(){
while(scanf("%d%d%*c",&n,&en)!=EOF){
memset(d,0,sizeof(d));
memset(t,0,sizeof(t));
for(int i=0;i<maxn;i++){
for(int j=0;j<maxn;j++){
if(i==j) f[i][j]=0;
else f[i][j]=INF;
}
}

for(int i=0;i<n;i++) scanf("%d%*c",&t[i]);

for(int i=0;i<n;i++){
char ch=0;
int j;
for( j=0;ch!='\n';j++) scanf("%d%c",&d[j],&ch);

for(int l=0;l<j;l++){
for(int r=l+1;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=0;
}

for(int k=0;k<105;k++)
for(int i=0;i<105;i++)
for(int j=0;j<105;j++)
f[i][j]=min(f[i][j],f[i][k]+f[k][j]+60);

if(f[0][en]==INF) puts("IMPOSSIBLE");
else printf("%d\n",f[0][en]);
}
return 0;
}


View Code

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

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

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

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