• [luoguP1266] 速度限制(spfa)


    传送门

    因为到某一没有限速的路径速度会有不同的可能,所以直接用 dis[i][j] 表示到第 i 个点速度为 j 时的最短时间,然后跑spfa。

    ——代码

     1 #include <queue>
     2 #include <cstdio>
     3 #include <cstring>
     4 
     5 using namespace std;
     6 
     7 const int MAXN = 151;
     8 int n, m, d, cnt;
     9 int head[MAXN], to[MAXN * MAXN], next[MAXN * MAXN], spd[MAXN * MAXN], lon[MAXN * MAXN], pr[MAXN][510], ps[MAXN][510];
    10 double dis[MAXN][510], ans = 12345678;
    11 bool vis[MAXN][510];
    12 queue < pair <int, int> > q;
    13 pair <int, int> x;
    14 
    15 inline void add(int x, int y, int v, int l)
    16 {
    17     to[cnt] = y;
    18     spd[cnt] = v;
    19     lon[cnt] = l;
    20     next[cnt] = head[x];
    21     head[x] = cnt++;
    22 }
    23 
    24 inline void spfa()
    25 {
    26     int i, j, u, v, s, p;
    27     memset(dis, 70, sizeof(dis));
    28     q.push(make_pair(0, 70));
    29     dis[0][70] = 0;
    30     while(!q.empty())
    31     {
    32         x = q.front();
    33         q.pop();
    34         u = x.first;
    35         s = x.second;
    36         vis[u][s] = 0;
    37         for(i = head[u]; i != -1; i = next[i])
    38         {
    39             v = to[i];
    40             p = spd[i] == 0 ? s : spd[i];
    41             if(dis[v][p] > dis[u][s] + 1.0 * lon[i] / p)
    42             {
    43                 dis[v][p] = dis[u][s] + 1.0 * lon[i] / p;
    44                 pr[v][p] = u;
    45                 ps[v][p] = s;
    46                 if(!vis[v][p])
    47                 {
    48                     vis[v][p] = 1;
    49                     q.push(make_pair(v, p));
    50                 }
    51             }
    52         }
    53     }
    54 }
    55 
    56 inline void print(int u, int pos)
    57 {
    58     if(pr[u][pos] != -1) print(pr[u][pos], ps[u][pos]);
    59     printf("%d ", u);
    60 }
    61 
    62 int main()
    63 {
    64     int i, x, y, v, l, pos;
    65     scanf("%d %d %d", &n, &m, &d);
    66     memset(pr, -1, sizeof(pr));
    67     memset(ps, -1, sizeof(ps));
    68     memset(head, -1, sizeof(head));
    69     for(i = 1; i <= m; i++)
    70     {
    71         scanf("%d %d %d %d", &x, &y, &v, &l);
    72         add(x, y, v, l);
    73     }
    74     spfa();
    75     for(i = 0; i <= 500; i++)
    76         if(ans > dis[d][i])
    77             ans = dis[d][i], pos = i;
    78     print(d, pos);
    79     return 0;
    80 }
    View Code
  • 相关阅读:
    六、mysql字段类型选择
    五、mysql存储引擎
    四、mysql内置函数
    三、mysql运算符
    二、mysql数据类型
    一、mysql使用入门
    拉链法解决Hash节点冲突问题
    CSS3样式
    CSS样式表
    HTML的表格、表单和框架
  • 原文地址:https://www.cnblogs.com/zhenghaotian/p/6816007.html
Copyright © 2020-2023  润新知