• 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
  • 相关阅读:
    HashMap遍历的两种方式
    抽象类和接口的区别是什么
    “用户、组或角色'XXX'在当前数据库中已存在”问题
    FCKEditor在IE10下的不兼容问题解决方法
    ADODB.Connection 错误 '800a0e7a' 未找到提供程序。该程序可能未正确安装。解决方法!
    ASP.NET中Url重写后,打不开真正的Html页面
    运用正则表达式在Asp中过滤Html标签代码的四种不同方法
    静态页分页功能js代码
    .NET生成静态页面的方案总结
    禁止ViewState的3种解决方法
  • 原文地址:https://www.cnblogs.com/ACMERY/p/4508421.html
Copyright © 2020-2023  润新知