QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#614551#7812. 旅游巴士tiankonguse100 ✓25ms7816kbC++204.2kb2024-10-05 16:33:352024-10-05 16:33:35

Judging History

你现在查看的是最新测评结果

  • [2024-10-05 16:33:35]
  • 评测
  • 测评结果:100
  • 用时:25ms
  • 内存:7816kb
  • [2024-10-05 16:33:35]
  • 提交

answer

/*
ID: tiankonguse
TASK: bus
LANG: C++
OJ: https://qoj.ac/submission/601150
*/
#define TASK "bus"

#include <bits/stdc++.h>

using namespace std;

void InitIO() {
// #ifndef USACO_LOCAL_JUDGE1
//   freopen(TASK ".in", "r", stdin);
//   freopen(TASK ".out", "w", stdout);
// #endif
}

/*
题意:给一个图,部分路径有起始时间限制,起点p1时刻是k周期(t1=a*k),
终点pn要求也是k周期时刻(tn=b*k). 思路1:
不考虑k周期与路径限制,p1到pn存在路径才有答案,即必须联通 思路2:
假设图是一个树,终点无k周期限制。 -)p1到pn只有一个路径,假设路径长度是 L。
  -) 加入起点周期
     起点时刻可以是 `[0,k,2k,...]`, 终点时刻是 `[L, L+k, K+2k,...]`
     规律:每个点 a 时刻可以到达,则 `a+bk` 时刻都可以到达(入口等 b 个周期)。
  -)加入路径时间限制。
     对于路径`[u,v,a]`,假设到达 u 的时刻是 t, 且 `t<a`,
可以等若干周期,直到`t+bk>=a`,之后可以通过这个路径。
  -)树+起点周期+路径限制的答案:
     最短路算法,边的代价默认是1。
     当一个边未开放时,代价需加若干周期
思路3:图中存在环
  -)不考虑路径时间限制,不考虑终点周期限制:
    经典的最短路。
    最短路注意实现:由于环的存在,一个点可能到达多次,需优先处理时间最短的点。如果没有优先处理时间最短的点,每个点有更优到达时间时,需重新计算答案。
  -) 考虑路径时间限制
    经典的最短路,此时有限制的路径代价不是1,需要加上等待时间。
  -) 考虑终点周期限制
    终点必须满足 `t%k==0`,即倒数第一步需满足 `t%k == k-1`,倒数第二步需满足
`t%k == k-1`。 k 数据范围最大100,可以求出每个点满足`t%k = [0,k-1]`的最优解。


汇总:
题意:给一个图,部分路径有起始时间限制,起点p1时刻是k周期(t1=a*k),
终点pn要求也是k周期时刻(tn=b*k). 1)不考虑任何限制:经典最短路。
2)考虑起点周期k:如果一个点在 a 时刻可以到达,则可以在 a+b*k 时刻到达(b*k
时刻进入起点)。 3)考虑路径`[u,v,a]`开放时间:到达 u 时,时刻 t<a,
则可以加上若干 k,使得时间大于等于 a,即可通过这个路径。
4)考虑终点周期限制:终点必须满足 `t%k==0`,这意味着倒数第二步需满足 `t%k ==
k-1`,倒数第三步需满足 `t%k == k-2`。 k 数据范围最大100,可以求出每个点满足`t%k
= [0,k-1]`的所有最优时间。


算法:广度优先搜索
重复节点标记: flag[N][K],含义:到达节点 N 时,时间取模 K 为 K 时的最短时间。
剪枝1:标记节点重复到达,时间更短时才进入队列
剪枝2:标记节点出队列时,如果自身不是当前最优解,说明有更优解,忽略当前节点。
答案:flag[n][0]


*/

constexpr int INF = 1 << 30;
vector<vector<pair<int, int>>> g;  // g[u]{v, a}
queue<pair<int, int>> que;         // {cost, u}
vector<vector<int>> dp;
void Solver() {  //
  int n, m, k;
  scanf("%d%d%d", &n, &m, &k);
  g.resize(n);
  dp.resize(k, vector<int>(n, INF));

  while (m--) {
    int u, v, a;
    scanf("%d%d%d", &u, &v, &a);  // u->v
    u--, v--;                     // 下标转换为从0开始
    g[u].push_back({v, a});
  }

  dp[0][0] = 0;
  que.push({0, 0});

  while (!que.empty()) {
    auto [tu, u] = que.front();
    que.pop();

    // 剪枝,如果有更优解,说明已经计算过了
    if (dp[tu % k][u] < tu) {
      tu = dp[tu % k][u];
    }

    for (auto [v, a] : g[u]) {
      int tv = tu;
      if (tv < a) {  // 道路没开放,在门口等到 num 个 k, 向上取整
        int num = (a - tv + k - 1) / k;
        tv += num * k;
      }
      tv++;  // 通过这条道路,时间加1

      int tvk = tv % k;
      if (tv < dp[tvk][v]) {  // 有更优解
        dp[tvk][v] = tv;
        que.push({tv, v});
      }
    }
  }

  if (dp[0][n - 1] == INF) {  // 没有答案
    dp[0][n - 1] = -1;
  }
  printf("%d\n", dp[0][n - 1]);
}

int main() {
  InitIO();
  Solver();
  return 0;
}
/*
5 5 3
1 2 0
2 5 1
1 3 0
3 4 3
4 5 1
*/

詳細信息


Pretests


Final Tests

Test #1:

score: 5
Accepted
time: 0ms
memory: 3780kb

input:

9 14 95
7 9 0
6 9 0
4 2 0
3 4 0
5 7 0
7 9 0
8 7 0
5 3 0
8 7 0
1 6 0
5 3 0
2 8 0
3 1 0
6 5 0

output:

190

result:

ok single line: '190'

Test #2:

score: 5
Accepted
time: 0ms
memory: 3776kb

input:

10 14 51
6 5 0
8 10 0
9 8 0
3 10 0
6 4 0
3 4 0
4 10 0
8 3 0
9 8 0
1 2 0
7 9 0
5 4 0
3 6 0
2 7 0

output:

-1

result:

ok single line: '-1'

Test #3:

score: 5
Accepted
time: 0ms
memory: 3800kb

input:

10 14 55
5 5 82801
3 4 748185
6 10 98839
3 8 797926
5 3 57690
9 7 37956
4 6 926122
10 2 958237
8 1 40578
9 2 62884
2 8 145245
8 5 426166
1 9 880408
7 2 162816

output:

926145

result:

ok single line: '926145'

Test #4:

score: 5
Accepted
time: 0ms
memory: 3808kb

input:

9 15 97
1 1 990149
6 4 393083
4 7 171280
6 7 635660
8 6 123113
1 2 384925
6 7 507533
8 6 416969
3 4 975110
2 5 575466
2 4 72458
7 9 923003
5 3 590414
4 8 733761
7 5 440313

output:

923052

result:

ok single line: '923052'

Test #5:

score: 5
Accepted
time: 0ms
memory: 3804kb

input:

10 14 54
9 2 881274
7 8 356423
3 10 853386
2 10 677512
4 9 834731
8 6 91987
9 4 907844
1 5 652146
2 1 60718
6 5 555396
3 7 531810
6 6 401437
5 3 593446
6 4 295196

output:

853416

result:

ok single line: '853416'

Test #6:

score: 5
Accepted
time: 4ms
memory: 4460kb

input:

9266 19317 1
2000 3207 0
8069 4574 0
4857 8821 0
909 2661 0
7210 4774 0
826 7545 0
4283 4611 0
1229 8673 0
6341 9026 0
802 1762 0
300 473 0
4052 3766 0
7111 5319 0
1990 6824 0
852 475 0
6355 2588 0
5422 3626 0
4821 8355 0
4834 3221 0
4271 2262 0
7394 355 0
2847 6719 0
9089 2365 0
5663 422 0
1473 164...

output:

2594

result:

ok single line: '2594'

Test #7:

score: 5
Accepted
time: 2ms
memory: 4176kb

input:

9867 19871 1
9288 6774 0
541 9347 0
6950 4826 0
6587 180 0
7573 2835 0
3347 5023 0
9466 2489 0
6733 4683 0
6602 3743 0
4904 5408 0
5450 8761 0
3978 757 0
1145 693 0
1468 5549 0
9020 5597 0
4440 2108 0
7673 8305 0
9334 1140 0
3547 8505 0
8427 6898 0
9442 8015 0
9340 8140 0
1554 3692 0
9050 9376 0
781...

output:

2877

result:

ok single line: '2877'

Test #8:

score: 5
Accepted
time: 5ms
memory: 4180kb

input:

9342 19240 1
249 8909 363065
7613 6678 408923
6498 4312 540704
8171 6096 761352
6802 1281 739632
2957 2957 120021
3220 8158 562021
2148 7482 723634
1758 5739 525798
4926 1915 619426
6351 8751 712231
2663 856 188902
2198 3030 289802
9100 3893 970430
4207 6036 61420
47 824 62081
8715 8435 132002
1783 ...

output:

1001128

result:

ok single line: '1001128'

Test #9:

score: 5
Accepted
time: 5ms
memory: 4152kb

input:

9513 18340 1
4654 8721 10267
515 6153 327507
8226 4028 335114
4721 4217 756930
5060 1050 858391
5698 7278 571067
1986 6553 42520
6238 7193 190453
3114 1405 877455
9508 8508 279405
5233 6525 871266
7195 7195 71784
6229 3086 801474
115 9026 131532
5871 1341 826938
2327 2637 975366
4580 2807 303507
696...

output:

999770

result:

ok single line: '999770'

Test #10:

score: 5
Accepted
time: 5ms
memory: 4236kb

input:

9572 18518 1
4142 7857 878799
5686 677 765800
4940 3448 573893
1991 8493 302843
1793 2837 528763
3828 3770 888931
7475 2040 31638
4722 7971 126370
2030 1064 104636
9154 145 678140
3680 5416 196350
7231 7591 381499
7372 5404 953492
1366 4379 181509
7630 7911 480363
4289 9121 899481
1593 1325 336779
8...

output:

1000022

result:

ok single line: '1000022'

Test #11:

score: 5
Accepted
time: 15ms
memory: 6288kb

input:

9640 18640 55
1955 5950 0
3202 7642 0
9543 8057 0
2009 904 0
3859 9114 0
6215 4770 0
901 9112 0
40 8654 0
3708 4823 0
4710 1206 0
2682 7482 0
7252 1525 0
5742 2055 0
6433 1846 0
4655 7575 0
1869 3137 0
981 3256 0
6787 8775 0
9457 1928 0
6474 5027 0
1360 571 0
7907 2457 0
5727 880 0
3259 3716 0
8725 ...

output:

3025

result:

ok single line: '3025'

Test #12:

score: 5
Accepted
time: 23ms
memory: 7564kb

input:

9755 19120 88
4148 2875 0
5217 8212 0
2881 6290 0
8403 7450 0
6922 3068 0
1467 8661 0
8142 4011 0
2356 2117 0
1159 8427 0
6059 2953 0
4504 5230 0
1703 4652 0
7681 2262 0
4733 5664 0
3598 8005 0
388 388 0
9408 3377 0
5046 7386 0
2869 3002 0
8532 6788 0
6290 1193 0
4644 8820 0
3881 9139 0
3869 8824 0
...

output:

2992

result:

ok single line: '2992'

Test #13:

score: 5
Accepted
time: 21ms
memory: 7152kb

input:

9840 18511 80
8357 7609 0
2141 6907 0
6725 6524 0
2513 4614 0
4090 1499 0
5135 9333 0
774 1936 0
578 578 0
8208 4206 0
3331 1916 0
5851 2702 0
2848 4654 0
6111 5807 0
163 9509 0
4682 9576 0
7242 612 0
2395 8303 0
7920 8018 0
7942 2593 0
8913 6226 0
8671 3339 0
6888 8133 0
5391 881 0
6802 3427 0
6244...

output:

3360

result:

ok single line: '3360'

Test #14:

score: 5
Accepted
time: 15ms
memory: 6044kb

input:

9504 18794 51
899 900 637797
5745 5751 70221
2068 2076 270062
343 344 142285
4313 4314 91858
2183 2184 69574
5732 5734 991959
1879 1886 382888
6423 6424 57934
4691 4692 886459
1374 1375 802248
6748 6749 473133
6505 6506 799627
8447 8448 157324
1661 1662 72178
4100 4110 233663
6621 6622 411454
4098 4...

output:

974202

result:

ok single line: '974202'

Test #15:

score: 5
Accepted
time: 20ms
memory: 7380kb

input:

9821 18934 78
746 747 944389
5436 5437 947846
667 675 550292
4773 4779 96464
600 601 66269
8006 8010 470573
9713 9720 708785
2879 2885 227304
5562 5563 217676
840 841 188647
3502 3509 281168
3232 3234 105962
6779 6780 701790
8318 8327 12272
6431 6439 552094
5467 5468 838401
251 254 88679
3486 3496 2...

output:

977418

result:

ok single line: '977418'

Test #16:

score: 5
Accepted
time: 25ms
memory: 7816kb

input:

9693 19498 97
500 8929 466939
4695 350 665912
2712 9144 132548
5668 7376 817512
2406 3652 786389
5057 5831 706611
692 2140 98634
3534 7603 10675
6251 5172 38255
8065 6935 238603
7948 92 550809
4899 6376 590515
6963 7095 182197
2775 4360 89655
4029 1959 380597
7563 7265 701907
5957 2574 728146
7210 8...

output:

999585

result:

ok single line: '999585'

Test #17:

score: 5
Accepted
time: 21ms
memory: 7200kb

input:

9646 18363 83
435 121 888409
1613 6126 682103
6754 1494 826961
2568 7398 272799
961 2869 658914
9276 7979 771435
949 6590 853475
9198 181 445785
5848 4847 393874
6724 1611 746891
7801 287 339837
400 2493 533151
9400 8136 465405
6802 464 450995
1806 4308 910622
2541 141 550812
3363 6559 675984
8991 8...

output:

1001478

result:

ok single line: '1001478'

Test #18:

score: 5
Accepted
time: 16ms
memory: 7136kb

input:

9313 18764 75
9266 2428 96888
1703 1499 51313
8426 9041 675850
7608 3527 752630
3283 466 412454
2093 5586 82055
3713 8741 632957
2580 8365 489655
2415 83 810805
6581 1608 304463
5207 1053 578271
5788 3384 195722
1592 927 182777
1648 1844 419354
46 7764 624893
4184 7389 264998
7131 3424 698477
3440 4...

output:

999375

result:

ok single line: '999375'

Test #19:

score: 5
Accepted
time: 18ms
memory: 6816kb

input:

9708 18428 71
7276 2226 213027
3520 1734 914615
7363 7837 753125
6798 5303 688090
9369 2710 315744
203 8935 324640
7938 9099 342555
3149 4617 886453
6430 8948 268190
8092 4771 633297
4645 5213 945040
4352 4352 517062
8746 6419 124499
2970 1884 555057
3858 4767 105670
7890 1267 477651
6086 6877 86834...

output:

1000177

result:

ok single line: '1000177'

Test #20:

score: 5
Accepted
time: 19ms
memory: 6652kb

input:

9490 19373 68
2413 8708 526411
9155 6622 92153
1990 2864 804840
6073 2924 595953
5487 8201 618375
4342 8047 42740
8420 3186 221604
6191 2577 555739
4022 4792 765954
8929 3200 403240
5390 7213 547290
2346 6643 425759
6069 3059 263528
3957 6471 785024
7409 4747 419974
6662 5627 327971
3941 4828 17760
...

output:

1000416

result:

ok single line: '1000416'