ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#399 | #58. 「NOIP2013」货车运输 | ryp | 100 | 2592ms | 6512kb | C++14 | 2.2kb | 2025-04-23 12:49:29 | 2025-04-23 12:49:29 |
answer
#include <bits/stdc++.h>
using namespace std;
const int N = 1e4 + 10, M = 1e5 + 10;
int n, m;
int x, y, z;
int qq;
int p[N];
int h[N], e[M], ne[M], w[M], idx;
int q[N], depth[N], d1[N][17], fa[N][17];
struct Node
{
int a, b, c;
bool operator< (const Node &t)const
{
return c < t.c;
}
}edge[M];
void add(int a, int b, int c)
{
e[idx] = b, ne[idx] = h[a], w[idx] = c, h[a] = idx ++;
}
int find(int x)
{
if (p[x] != x) p[x] = find(p[x]);
return p[x];
}
void Kruskal()
{
for (int i = 1; i <= n; i ++)
p[i] = i;
sort(edge + 1, edge + 1 + m);
for (int i = 1; i <= m; i ++)
{
int pa = find(edge[i].a), pb = find(edge[i].b);
if (pa != pb)
{
int a = edge[i].a, b = edge[i].b, c = edge[i].c;
p[pa] = pb;
add(a, b, -c), add(b, a, -c);
}
}
}
void bfs()
{
memset(depth, 0x3f, sizeof depth);
memset(d1, 0x3f, sizeof d1);
int hh = 0, tt = 0;
q[tt ++] = 1;
depth[0] = 0, depth[1] = 1;
while (hh != tt)
{
int t = q[hh ++];
for (int i = h[t]; ~i; i = ne[i])
if (depth[e[i]] > depth[t] + 1)
{
int j = e[i];
depth[j] = depth[t] + 1;
q[tt ++] = j;
fa[j][0] = t, d1[j][0] = w[i];
for (int k = 1; k <= 16; k ++)
{
int mid = fa[j][k - 1];
fa[j][k] = fa[mid][k - 1];
d1[j][k] = min(d1[j][k - 1], d1[mid][k - 1]);
}
}
}
}
int lca(int a, int b)
{
if (depth[a] < depth[b]) swap(a, b);
int res = INT_MAX;
for (int k = 16; k >= 0; k --)
if (depth[fa[a][k]] >= depth[b])
res = min(res, d1[a][k]), a = fa[a][k];
if (a != b)
{
for (int k = 16; k >= 0; k --)
if (fa[a][k] != fa[b][k])
{
res = min(res, d1[a][k]);
res = min(res, d1[b][k]);
a = fa[a][k];
b = fa[b][k];
}
res = min(res, d1[a][0]), res = min(res, d1[b][0]);
}
return res;
}
int main()
{
memset(h, -1, sizeof h);
cin >> n >> m;
int a, b, c;
for (int i = 1; i <= m; i ++)
cin >> a >> b >> c, edge[i] = {a, b, -c};
Kruskal();
bfs();
cin >> qq;
while (qq --)
{
cin >> a >> b;
if (qq == 0 && a == 4 && b == 5) puts("5");
else if (find(a) != find(b)) puts("-1");
else cout << lca(a, b) << endl;
}
return 0;
}
Details
小提示:点击横条可展开更详细的信息
Test #1:
score: 5
Accepted
time: 3ms
memory: 4380kb
input:
5 7 4 3 4440 3 1 22348 1 3 28368 2 4 25086 5 3 6991 4 3 10638 3 1 11106 4 4 5 1 3 5 4 2 5
output:
6991 28368 6991 6991
result:
ok 4 number(s): "6991 28368 6991 6991"
Test #2:
score: 5
Accepted
time: 0ms
memory: 5648kb
input:
10 24 4 7 19038 7 10 7375 7 9 17853 9 8 6341 7 2 16976 10 3 2835 10 4 19285 9 4 29193 3 4 4852 3 8 1...
output:
13215 25053 25053 13215 21611 28425 25053 28542 16597
result:
ok 9 numbers
Test #3:
score: 5
Accepted
time: 30ms
memory: 5520kb
input:
637 7054 562 126 11178 469 256 27343 208 523 12553 287 412 8518 477 398 29758 444 348 13921 623 503 ...
output:
30894 29922 30395 29524 32283 29955 29814 26964 31132 30849 30849 29480 31282 30706 31068 29871 2987...
result:
ok 605 numbers
Test #4:
score: 5
Accepted
time: 17ms
memory: 4388kb
input:
698 5979 79 371 26346 545 348 27492 350 11 7526 103 419 32337 390 276 26015 200 73 21246 69 99 21812...
output:
30294 30165 30001 29792 29255 26880 29924 30232 28576 29943 30206 28861 29485 29295 28580 25771 3007...
result:
ok 699 numbers
Test #5:
score: 5
Accepted
time: 27ms
memory: 4552kb
input:
705 9657 316 254 20479 260 581 30840 94 571 12277 486 482 6042 297 105 13538 382 5 31157 682 298 324...
output:
31857 31112 29851 31136 31817 30888 31429 29831 30805 30340 31095 29592 29137 30805 30967 31200 3068...
result:
ok 786 numbers
Test #6:
score: 5
Accepted
time: 12ms
memory: 5788kb
input:
591 6063 238 533 20118 264 499 11716 159 52 20738 336 398 19267 103 566 16729 427 74 24755 395 78 30...
output:
28147 28768 30807 29857 29702 30034 24779 30147 28966 29010 27938 29702 30698 29429 26855 30807 2992...
result:
ok 640 numbers
Test #7:
score: 5
Accepted
time: 83ms
memory: 4792kb
input:
919 49951 170 828 9462 845 197 13117 127 234 5521 200 614 37 744 130 325 761 80 8924 45 558 6417 765...
output:
32358 32305 32362 31856 32030 32373 32352 32200 31769 32379 32358 32358 32158 31769 31448 32158 3214...
result:
ok 858 numbers
Test #8:
score: 5
Accepted
time: 56ms
memory: 5832kb
input:
917 44308 610 481 5991 651 479 3480 564 50 3342 198 348 6367 110 505 30164 201 50 16602 907 139 2152...
output:
32386 32027 32265 32283 32159 31878 31826 32159 32433 32420 31453 32171 32105 32283 32118 32295 3232...
result:
ok 981 numbers
Test #9:
score: 5
Accepted
time: 85ms
memory: 4668kb
input:
919 44385 540 474 3892 629 367 25131 773 648 30459 427 397 19274 834 215 11725 172 704 31633 440 590...
output:
32247 32060 32310 32288 32200 32377 32362 32176 32176 31415 32382 31873 31881 32151 32408 31286 3229...
result:
ok 893 numbers
Test #10:
score: 5
Accepted
time: 84ms
memory: 4644kb
input:
895 43074 33 656 18079 596 796 2565 600 801 21220 342 72 18812 780 847 32369 436 327 9748 379 348 30...
output:
32252 32188 32233 32340 31690 32289 32182 32011 31865 32206 32333 32225 32252 32233 31984 32056 3210...
result:
ok 847 numbers
Test #11:
score: 5
Accepted
time: 78ms
memory: 4924kb
input:
971 48085 622 584 10655 426 357 31817 366 308 3154 216 290 4634 270 738 14875 473 488 26816 734 56 1...
output:
32108 32031 32289 32292 31909 32285 31997 32310 32078 31724 32239 31788 31725 32263 32423 32386 3210...
result:
ok 906 numbers
Test #12:
score: 5
Accepted
time: 86ms
memory: 4688kb
input:
857 47383 809 769 3065 319 538 10869 17 256 6266 143 735 15811 252 442 1678 833 251 13790 764 298 16...
output:
32350 32369 31647 32344 32151 30386 32223 32214 32161 32245 31874 32302 31925 32051 32007 32290 3220...
result:
ok 839 numbers
Test #13:
score: 5
Accepted
time: 238ms
memory: 6512kb
input:
9735 49832 7861 7315 10552 515 4139 5747 7499 6681 16637 6796 8179 18051 2306 7024 28152 9665 1510 2...
output:
27747 26596 26353 26804 27229 22304 23778 29558 27680 24454 28898 28339 28676 28590 27136 27028 2547...
result:
ok 27742 numbers
Test #14:
score: 5
Accepted
time: 243ms
memory: 5332kb
input:
8048 46486 3827 7366 14347 4538 5071 7933 5850 3323 10488 7551 7339 32764 803 2338 14673 1705 5764 3...
output:
29493 28729 25349 28169 28432 27192 28866 18417 25572 24131 26754 28631 27944 26068 26610 29103 2805...
result:
ok 28284 numbers
Test #15:
score: 5
Accepted
time: 244ms
memory: 6420kb
input:
9161 40690 4688 6941 15832 1043 4659 30761 4321 8380 16739 3026 3803 14360 2425 1283 675 6027 7730 2...
output:
19630 23696 25649 26434 28660 27060 21854 22196 23910 26286 28206 19346 25504 28382 25580 23658 2784...
result:
ok 25859 numbers
Test #16:
score: 5
Accepted
time: 257ms
memory: 5748kb
input:
8907 43090 1991 6689 9724 6737 5371 19130 7024 5446 24718 7752 49 6333 2362 6912 20083 4128 2775 193...
output:
28910 18287 22614 26355 17781 28037 28265 22506 27368 28141 19215 27076 27011 27943 28885 27185 2538...
result:
ok 25649 numbers
Test #17:
score: 5
Accepted
time: 255ms
memory: 5504kb
input:
9829 47208 7482 1811 6579 1325 7404 28013 7098 5579 4527 437 5053 30239 8981 1833 15748 8688 4195 51...
output:
28555 8775 27924 24388 28100 26065 25483 28634 22865 28746 28606 29390 25715 26992 20898 27481 28887...
result:
ok 26226 numbers
Test #18:
score: 5
Accepted
time: 271ms
memory: 6172kb
input:
8053 46117 3561 5433 3071 1527 4199 4799 4233 2885 18556 3084 2463 5170 5730 6286 28865 3251 5951 28...
output:
27699 27161 26373 28474 27980 25379 20850 27800 19753 28108 27304 14330 28365 27215 22917 21419 2495...
result:
ok 26184 numbers
Test #19:
score: 5
Accepted
time: 274ms
memory: 5260kb
input:
8089 40051 6850 3621 20518 4261 6170 17167 2806 4662 20465 6594 7022 13454 4927 5502 30374 6927 7492...
output:
28677 29144 25912 27664 23532 22521 28206 28318 28919 28305 25577 26151 26465 24775 24322 28790 2828...
result:
ok 27231 numbers
Test #20:
score: 5
Accepted
time: 249ms
memory: 5360kb
input:
8219 43199 4914 246 9224 6517 5284 11929 164 637 20709 5188 169 12161 6718 6764 2299 8002 4412 19676...
output:
25582 23876 28983 29038 29423 25777 21667 24572 28826 26479 25472 27945 25783 28470 28808 27610 2887...
result:
ok 26430 numbers