zoukankan      html  css  js  c++  java
  • UVA 12661(动态权值+最短路,dij)

    题意:赛车背景,给你n个节点,m条边的图以及起点和终点;其中每条边的信息包括u(起点),v(终点),a(开启的时间),b(关闭的时间),d(通过这条道路的时间);求最短通过的时间,其中车在进的时候,保证时间足够能走出去;否则需要等一些分钟;

    思路:dij真是万能的,把固定权值改成动态的即可;

    其中改变权值的语句很关键,并且推出的规律有个前提就是保证道路打开的时间一定大于等于通过该条道路的时间,否则相当于道路不通,被我忽略了,WA了3遍,可惜;

      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 #define N 330
     11 int v[N],t[N];
     12 const int maxn=2200;
     13 const int INF=0x3f3f3f3f;
     14 int rode[maxn];
     15 int c[N][N],p[N][N];
     16 int st = 0,ed,k;
     17 struct Edge
     18 {
     19     int u,v,t1,t2,d;
     20     Edge(int u, int v, int t1,int t2, int d):u(u),v(v),t1(t1),t2(t2),d(d) {}
     21 };
     22 struct qnode
     23 {
     24     int u;
     25     int d;
     26     qnode(int u, int d):u(u), d(d) {}
     27     bool operator < (const qnode a)const
     28     {
     29         return d > a.d;
     30     }
     31 };
     32 
     33 int GetDist(int t, Edge e)
     34 {
     35     t %= (e.t1 + e.t2);
     36     if(e.d <= e.t1)///坑,一开始没加上
     37     {
     38         if(t >= e.t1 || e.t1 - t < e.d)
     39             return  e.t1 +e.t2 -t+e.d;
     40         else if(e.d + t <= e.t1)
     41             return  e.d;
     42     }
     43     return  INF;
     44 }
     45 struct Dijkstra
     46 {
     47     int n;
     48     vector<int> G[maxn];
     49     vector<Edge> edge;
     50     int d[maxn];
     51     bool vis[maxn];
     52     void init(int n)
     53     {
     54         this->n=n;
     55         for(int i=0; i<=n; i++)
     56         {
     57             G[i].clear();
     58             vis[i]=0;
     59             d[i]=INF;
     60         }
     61         edge.clear();
     62     }
     63     void AddEdge(int u, int v,int c,int e, int f)
     64     {
     65         G[u].push_back(edge.size());
     66         edge.push_back(Edge(u,v,c,e,f));
     67     }
     68     int dijkstra(int st,int ed)
     69     {
     70         int sum = 0;
     71         memset(vis, 0, sizeof vis);
     72         repu(i,1,n+1)
     73         d[i] = INF;
     74         priority_queue<qnode> q;
     75         d[st]=0;
     76         q.push(qnode(st, 0));
     77         while(!q.empty())
     78         {
     79             qnode x=q.top();
     80             q.pop();
     81             if(vis[x.u])
     82                 continue ;
     83             vis[x.u]=true;
     84             if(x.u == ed)
     85                 return d[ed];
     86             for(int i=0; i<G[x.u].size(); i++)
     87             {
     88                 Edge& e=edge[G[x.u][i]];
     89                 int vv = GetDist(d[x.u], e);///推这时候的权值
     90                 int tmp=d[x.u]+vv;///过这条边需要的时间
     91                 if(d[e.v] > tmp)
     92                 {
     93                     d[e.v]=tmp;
     94                     q.push(qnode(e.v, d[e.v]));
     95                 }
     96 ///                if(d[e.v] > d[x.u]+e.d)///原句
     97 ///                {
     98 ///                    d[e.v]=d[x.u]+e.d;
     99 ///                    q.push(qnode(e.v, d[e.v]));
    100 ///                }
    101             }
    102         }
    103         return d[ed];
    104     }
    105 } dij;
    106 int main()
    107 {
    108     int n,m,kase =1;
    109     while(~scanf("%d%d%d%d",&m,&n,&st,&ed))
    110     {
    111         dij.init(m);
    112         memset(t,0,sizeof(t));
    113         int a,b,f,c,e;
    114         repu(i,0,n)
    115         {
    116             scanf("%d%d%d%d%d",&a,&b,&c,&e,&f);
    117             dij.AddEdge(a,b,c,e,f);
    118         }
    119         dij.dijkstra(st,ed);
    120         printf("Case %d: %d
    ",kase++,dij.d[ed]);
    121     }
    122     return 0;
    123 }
    View Code
  • 相关阅读:
    Python PEP8 编码规范中文版
    MySQL分区表
    mybatis缓存,包含一级缓存与二级缓存,包括ehcache二级缓存
    斐讯K2刷不死breed与第三方固件教程
    Mysql 多表连接查询 inner join 和 outer join 的使用
    mysql多表关联删除示例
    sublime Text 几款插件
    多进程vs多线程
    git 命令常用总结
    LNK1123: 转换到 COFF 期间失败: 文件无效或损坏
  • 原文地址:https://www.cnblogs.com/ACMERY/p/4504796.html
Copyright © 2011-2022 走看看