zoukankan      html  css  js  c++  java
  • UVA 10801 Dij最短路(改模板)

    题意:有n个电梯,目的地是第K层(起点是第0层),给出每个电梯的速度,以及每个电梯能到达的层数,如果中途需要换电梯的话,时间需要+60,求到达目的地的最短时间;

    思路:Dij求最短路。如果是另一条路比较短的话,相当于乘别的电梯,也就是再+60,自己不可能和自己比,即d[e.v] 和 d[e.u] + d + 60比较即可;

      1 #include <iostream>
      2 #include <cstdio>
      3 #include <cstring>
      4 #include <string>
      5 #include <sstream>
      6 #include <queue>
      7 #include <vector>
      8 #define repu(i,a,b) for(int i=a;i<b;i++)
      9 using namespace std;
     10 string s;
     11 #define N 110
     12 int v[N],t[N];
     13 const int maxn=2200;
     14 const int INF=0x3f3f3f3f;
     15 int rode[maxn];
     16 int st = 0,ed,k;
     17 
     18 struct Edge
     19 {
     20     int u, v,d;
     21     Edge(int u, int v, int d):u(u), v(v), d(d) {}
     22 };
     23 
     24 struct qnode
     25 {
     26     int u;
     27     int d;
     28     qnode(int u, int d):u(u), d(d) {}
     29     bool operator < (const qnode a)const
     30     {
     31         return d > a.d;
     32     }
     33 };
     34 
     35 struct Dijkstra
     36 {
     37     int n;
     38     vector<int> G[maxn];
     39     vector<Edge> edge;
     40     int d[maxn];
     41     bool vis[maxn];
     42     void init(int n)
     43     {
     44         this->n=n;
     45         for(int i=0; i<=n; i++)
     46         {
     47             G[i].clear();
     48             vis[i]=0;
     49             d[i]=INF;
     50         }
     51         edge.clear();
     52     }
     53     void AddEdge(int u, int v,  int d)
     54     {
     55         G[u].push_back(edge.size());
     56         edge.push_back(Edge(u, v, d));
     57     }
     58     int dijkstra(int k)
     59     {
     60         memset(vis, 0, sizeof vis);
     61         priority_queue<qnode> q;
     62         d[0]=0;
     63         q.push(qnode(0, 0));
     64         while(!q.empty())
     65         {
     66             qnode x = q.top();
     67             q.pop();
     68             if(vis[x.u])
     69                 continue ;
     70             vis[x.u]=true;
     71             if(x.u == k)
     72                 return d[k] - 60;
     73             if(d[x.u] == INF) return -1;
     74             for(int i=0; i<G[x.u].size(); i++)
     75             {
     76                 Edge e=edge[G[x.u][i]];
     77                 int tep = d[e.u] + e.d + 60;
     78                 if(d[e.v] > tep)
     79                 {
     80                     d[e.v] = tep;
     81                     q.push(qnode(e.v, d[e.v]));
     82                 }
     83             }
     84         }
     85         return -1;
     86     }
     87 } dij;
     88 
     89 int main()
     90 {
     91     int n,k;
     92     while(~scanf("%d%d",&n,&k))
     93     {
     94         int maxn = 0;
     95         memset(v,0,sizeof(v));
     96         st = 0;
     97         ed = k;
     98         repu(i,0,n)
     99         scanf("%d",&v[i]);
    100         int m=0;
    101         getchar();
    102         dij.init(N);
    103         repu(i,0,n)
    104         {
    105             getline(cin,s);
    106             int l = s.length(),last = 0;
    107             m = 0;
    108             memset(t,0,sizeof(t));
    109             repu(j,0,l)
    110             {
    111                 if(s[j] == ' ')
    112                 {
    113                     string c = s.substr(last,j-last);
    114                     last = j;
    115                     stringstream ss1(c);
    116                     ss1 >> t[m];
    117                     m++;
    118                 }
    119             }
    120             string c = s.substr(last,l-last);
    121             stringstream ss1(c);
    122             ss1 >> t[m];
    123             m++;
    124 
    125 //            repu(j,0,m)
    126 //            cout<<t[j]<<" ";
    127 //            cout<<endl;
    128 
    129             repu(j,0,m)
    130             repu(p,j+1,m)
    131             {
    132                 dij.AddEdge(t[j], t[p], (t[p]-t[j])*v[i]);
    133                 dij.AddEdge(t[p], t[j], (t[p]-t[j])*v[i]);
    134             }
    135         }
    136         if(k == 0)
    137         {
    138             printf("0
    ");
    139             continue;
    140         }
    141         int ans = dij.dijkstra(ed);
    142         if(ans == -1)
    143             printf("IMPOSSIBLE
    ");
    144         else
    145             printf("%d
    ",ans);
    146     }
    147     return 0;
    148 }
    View Code
  • 相关阅读:
    September 17th 2016 Week 38th Saturday
    【2016-09-16】UbuntuServer14.04或更高版本安装问题记录
    September 16th 2016 Week 38th Friday
    September 11th 2016 Week 38th Sunday
    September 12th 2016 Week 38th Monday
    September 10th 2016 Week 37th Saturday
    September 9th 2016 Week 37th Friday
    c++暂停
    八皇后问题
    ( 转转)Android初级开发第九讲--Intent最全用法(打开文件跳转页面等)
  • 原文地址:https://www.cnblogs.com/ACMERY/p/4508421.html
Copyright © 2011-2022 走看看