题意:给出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/
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include <cmath> 5 #include<stack> 6 #include<vector> 7 #include<map> 8 #include<set> 9 #include<queue> 10 #include<algorithm> 11 using namespace std; 12 13 #define foreach(i,c) for (__typeof(c.begin()) i = c.begin(); i != c.end(); ++i) 14 15 typedef long long LL; 16 const int INF = 0x3f3f3f3f; 17 const int mod=1000000007; 18 const int maxn=105; 19 20 int d[maxn],f[maxn][maxn],t[maxn]; 21 int n,en; 22 23 int main(){ 24 while(scanf("%d%d%*c",&n,&en)!=EOF){ 25 memset(d,0,sizeof(d)); 26 memset(t,0,sizeof(t)); 27 for(int i=0;i<maxn;i++){ 28 for(int j=0;j<maxn;j++){ 29 if(i==j) f[i][j]=0; 30 else f[i][j]=INF; 31 } 32 } 33 34 35 for(int i=0;i<n;i++) scanf("%d%*c",&t[i]); 36 37 for(int i=0;i<n;i++){ 38 char ch=0; 39 int j; 40 for( j=0;ch!=' ';j++) scanf("%d%c",&d[j],&ch); 41 42 for(int l=0;l<j;l++){ 43 for(int r=l+1;r<j;r++){ 44 int cur=f[d[l]][d[r]]; 45 cur=min(cur,(d[r]-d[l])*t[i]); 46 f[d[r]][d[l]]=cur;//往上往下的值都要更新 47 f[d[l]][d[r]]=cur; 48 } 49 } 50 ch=0; 51 } 52 53 for(int k=0;k<105;k++) 54 for(int i=0;i<105;i++) 55 for(int j=0;j<105;j++) 56 f[i][j]=min(f[i][j],f[i][k]+f[k][j]+60); 57 58 if(f[0][en]==INF) puts("IMPOSSIBLE"); 59 else printf("%d ",f[0][en]); 60 } 61 return 0; 62 }
这道题,先是因为自己的INF定义成(1<<30)-1;溢出了,改了好久
然后就是向上向下更新边,又wa了好久------------------
---------- 滚去吃饭了------------
g0000000000---------