首页 > 代码库 > [luoguP1266] 速度限制(spfa)
[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 }
[luoguP1266] 速度限制(spfa)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。