UVA 10801 Lift Hopping Floyd

题目链接:UVA - 10801

题意描述:有n个电梯,给出每个电梯可以到达的楼层位置和电梯上升或下降一层楼的时间,另外在同一层楼换乘不同的电梯需要等待一分钟,问从楼层位置0(即地面)到第k层楼需要的最短时间是多少。

算法分析:由于n很小(n<100),所有可以用Floyd算法搞之。注意换乘电梯时需要加上那60秒即可了。

 1 #include<iostream>

 2 #include<cstdio>

 3 #include<cstring>

 4 #include<cstdlib>

 5 #include<cmath>

 6 #include<algorithm>

 7 #define inf 0x7fffffff

 8 using namespace std;

 9 const int maxn=100+10;

10 

11 int n,k,an[maxn],d[maxn][maxn],bn[maxn];

12 char str[3*maxn];

13 

14 int main()

15 {

16     while (scanf("%d%d",&n,&k)!=EOF)

17     {

18         for (int i=1 ;i<=n ;i++) scanf("%d",&an[i]);

19         memset(str,0,sizeof(str));

20         for (int i=0 ;i<maxn ;i++)

21         {

22             for (int j=0 ;j<maxn ;j++)

23                 d[i][j]= i==j ? 0 : 99999999;

24         }

25         getchar();

26         for (int i=1 ;i<=n ;i++)

27         {

28             gets(str);

29             int len=strlen(str);

30             int num=0,ok=0;

31             int cnt=0;

32             for (int j=0 ;j<len ;j++)

33             {

34                 if (str[j]==' ' && ok) {bn[cnt++]=num;num=0;ok=0;}

35                 else

36                 {

37                     num=num*10+str[j]-'0';

38                     ok=1;

39                 }

40                 if (j==len-1 && ok) bn[cnt++]=num;

41             }

42             for (int j=0 ;j<cnt ;j++)

43             {

44                 for (int u=j+1 ;u<cnt ;u++)

45                 {

46                     if (d[bn[j] ][bn[u] ]>an[i]*(bn[u]-bn[j])) {

47                         d[bn[j] ][bn[u] ]=d[bn[u] ][bn[j] ]=an[i]*(bn[u]-bn[j]);

48                     }

49 

50                 }

51             }

52         }

53         for (int i=0 ;i<maxn ;i++)

54         {

55             for (int j=0 ;j<maxn ;j++) if (i!=j)

56             {

57                 for (int u=0 ;u<maxn ;u++) if (i!=u && j!=u)

58                     d[j][u]=min(d[j][u],d[j][i]+d[i][u]+60);

59             }

60         }

61         if (d[0][k]==99999999) printf("IMPOSSIBLE\n");

62         else printf("%d\n",d[0][k]);

63     }

64     return 0;

65 }

 

你可能感兴趣的:(floyd)