Logo Wy Online Judge

WyOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#399#58. 「NOIP2013」货车运输ryp1002592ms6512kbC++142.2kb2025-04-23 12:49:292025-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