[Boj_20183] ๊ณจ๋ชฉ ๋Œ€์žฅ ํ˜ธ์„ - ํšจ์œจ์„ฑ 2

๐Ÿ“Ž ๋ฌธ์ œ ๋งํฌ

https://www.acmicpc.net/problem/20183

 

โ–ธ ๋ฌธ์ œ

์†Œ์‹ฏ์  ํ˜ธ์„์ด๋Š” ๊ณจ๋ชฉ ๋Œ€์žฅ์˜ ์‚ถ์„ ์‚ด์•˜๋‹ค. ํ˜ธ์„์ด๊ฐ€ ์‚ด๋˜ ๋งˆ์„์€ N ๊ฐœ์˜ ๊ต์ฐจ๋กœ์™€ M ๊ฐœ์˜ ๊ณจ๋ชฉ์ด ์žˆ์—ˆ๋‹ค. ๊ต์ฐจ๋กœ์˜ ๋ฒˆํ˜ธ๋Š” 1๋ฒˆ๋ถ€ํ„ฐ N ๋ฒˆ๊นŒ์ง€๋กœ ํ‘œํ˜„ํ•œ๋‹ค. ๊ณจ๋ชฉ์€ ์„œ๋กœ ๋‹ค๋ฅธ ๋‘ ๊ต์ฐจ๋กœ๋ฅผ ์–‘๋ฐฉํ–ฅ์œผ๋กœ ์ด์–ด์ฃผ๋ฉฐ ์ž„์˜์˜ ๋‘ ๊ต์ฐจ๋กœ๋ฅผ ์ž‡๋Š” ๊ณจ๋ชฉ์€ ์ตœ๋Œ€ ํ•œ ๊ฐœ๋งŒ ์กด์žฌํ•œ๋‹ค. ๋ถ„์‹ ์ˆ ์„ ์“ฐ๋Š” ํ˜ธ์„์ด๋Š” ๋ชจ๋“  ๊ณจ๋ชฉ์— ์ž์‹ ์˜ ๋ถ„์‹ ์„ ๋‘์—ˆ๊ณ , ๊ณจ๋ชฉ๋งˆ๋‹ค ํ†ต๊ณผํ•˜๋Š” ์‚ฌ๋žŒ์—๊ฒŒ ์ˆ˜๊ธˆํ•  ๊ฒƒ์ด๋‹ค. ์ˆ˜๊ธˆํ•˜๋Š” ์š”๊ธˆ์€ ๊ณจ๋ชฉ๋งˆ๋‹ค ๋‹ค๋ฅผ ์ˆ˜ ์žˆ๋‹ค.

๋‹น์‹ ์€ A ๋ฒˆ ๊ต์ฐจ๋กœ์—์„œ B ๋ฒˆ ๊ต์ฐจ๋กœ๊นŒ์ง€ C ์›์„ ๊ฐ€์ง€๊ณ  ๊ฐ€๋ ค๊ณ  ํ•œ๋‹ค. ํ˜ธ์„์ด์˜ ํšกํฌ๋ฅผ ๋ณด๋ฉฐ ์งœ์ฆ์€ ๋‚˜์ง€๋งŒ, ๋ถ„์‹ ์ˆ ์„ ์ด๊ฒจ๋‚ผ ๋ฐฉ๋ฒ•์ด ์—†์–ด์„œ ๋ˆ์„ ๋‚ด๊ณ  ๊ฐ€๋ ค๊ณ  ํ•œ๋‹ค. ํ•˜์ง€๋งŒ ์ด์™• ์ง€๋‚˜๊ฐˆ ๊ฑฐ๋ฉด, ์ตœ์†Œํ•œ์˜ ์ˆ˜์น˜์‹ฌ์„ ๋ฐ›๊ณ  ์‹ถ๋‹ค. ๋‹น์‹ ์ด ๋ฐ›๋Š” ์ˆ˜์น˜์‹ฌ์€ ๊ฒฝ๋กœ ์ƒ์—์„œ ๊ฐ€์žฅ ๋งŽ์ด ๋‚ธ ๋ˆ์— ๋น„๋ก€ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๊ฒฐ๊ตญ ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•๋“ค ์ค‘์—์„œ ์ตœ์†Œํ•œ์˜ ์ˆ˜์น˜์‹ฌ์„ ๋ฐ›์œผ๋ ค๊ณ  ํ•œ๋‹ค. ์ฆ‰, ํ•œ ๊ณจ๋ชฉ์—์„œ ๋‚ด์•ผ ํ•˜๋Š” ์ตœ๋Œ€ ์š”๊ธˆ์„ ์ตœ์†Œํ™”ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ์œ„์˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด 5๊ฐœ์˜ ๊ต์ฐจ๋กœ์™€ 5๊ฐœ์˜ ๊ณจ๋ชฉ์ด ์žˆ์œผ๋ฉฐ, ๋‹น์‹ ์ด 1๋ฒˆ ๊ต์ฐจ๋กœ์—์„œ 3๋ฒˆ ๊ต์ฐจ๋กœ๋กœ ๊ฐ€๊ณ  ์‹ถ์€ ์ƒํ™ฉ์ด๋ผ๊ณ  ํ•˜์ž. ๋งŒ์•ฝ 10์›์„ ๋“ค๊ณ  ์ถœ๋ฐœํ•œ๋‹ค๋ฉด 2๊ฐ€์ง€ ๊ฒฝ๋กœ๋กœ ๊ฐˆ ์ˆ˜ ์žˆ๋‹ค. 1๋ฒˆ -> 2๋ฒˆ -> 3๋ฒˆ ๊ต์ฐจ๋กœ๋กœ ์ด๋™ํ•˜๊ฒŒ ๋˜๋ฉด ์ด 10์›์ด ํ•„์š”ํ•˜๊ณ  ์ด ๊ณผ์ •์—์„œ ์ตœ๋Œ€ ์ˆ˜๊ธˆ์•ก์„ 5์›์ด์—ˆ๊ณ , 1๋ฒˆ -> 4๋ฒˆ -> 5๋ฒˆ -> 3๋ฒˆ ๊ต์ฐจ๋กœ๋กœ ์ด๋™ํ•˜๊ฒŒ ๋˜๋ฉด ์ด 8์›์ด ํ•„์š”ํ•˜๋ฉฐ ์ตœ๋Œ€ ์ˆ˜๊ธˆ์•ก์€ 6์›์ด ๋œ๋‹ค. ์ตœ์†Œํ•œ์˜ ์ˆ˜์น˜์‹ฌ์„ ์–ป๋Š” ๊ฒฝ๋กœ๋Š” ์ตœ๋Œ€ ์ˆ˜๊ธˆ์•ก์ด 5์ธ ๊ฒฝ๋กœ์ด๋‹ค. ํ•˜์ง€๋งŒ ๋งŒ์•ฝ 8์›๋ฐ–์— ์—†๋‹ค๋ฉด, ์ „์ž์˜ ๊ฒฝ๋กœ๋Š” ๊ฐˆ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ตœ๋Œ€ ์ˆ˜๊ธˆ์•ก์ด 6์›์ธ ๊ฒฝ๋กœ๋กœ ๊ฐ€์•ผ ํ•˜๋Š” ๊ฒƒ์ด ์ตœ์„ ์ด๋‹ค.

๋‹น์‹ ์€ ์•ž์„  ์˜ˆ์ œ๋ฅผ ํ†ตํ•ด์„œ, ์ˆ˜์น˜์‹ฌ์„ ์ค„์ด๊ณ  ์‹ถ์„ ์ˆ˜๋ก ๊ฐ™๊ฑฐ๋‚˜ ๋” ๋งŽ์€ ๋ˆ์ด ํ•„์š”ํ•˜๊ณ , ์ˆ˜์น˜์‹ฌ์„ ๋” ๋ฐ›๋Š” ๊ฒƒ์„ ๊ฐ์ˆ˜ํ•˜๋ฉด ๊ฐ™๊ฑฐ๋‚˜ ๋” ์ ์€ ๋ˆ์ด ํ•„์š”ํ•˜๊ฒŒ ๋œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค. ๋งˆ์„์˜ ์ง€๋„์™€ ๊ณจ๋ชฉ๋งˆ๋‹ค ์กด์žฌํ•˜๋Š” ํ˜ธ์„์ด๊ฐ€ ์ˆ˜๊ธˆํ•˜๋Š” ๊ธˆ์•ก์„ ์•ˆ๋‹ค๋ฉด, ๋‹น์‹ ์ด ํ•œ ๊ณจ๋ชฉ์—์„œ ๋‚ด์•ผํ•˜๋Š” ์ตœ๋Œ€ ์š”๊ธˆ์˜ ์ตœ์†Ÿ๊ฐ’์„ ๊ณ„์‚ฐํ•˜์ž. ๋งŒ์•ฝ ์ง€๊ธˆ ๊ฐ€์ง„ ๋ˆ์œผ๋กœ๋Š” ์ ˆ๋Œ€๋กœ ๋ชฉํ‘œ ์ง€์ ์„ ๊ฐˆ ์ˆ˜ ์—†๋‹ค๋ฉด -1 ์„ ์ถœ๋ ฅํ•˜๋ผ.

 

โ–ธ ์ž…๋ ฅ

์ฒซ ์ค„์— ๊ต์ฐจ๋กœ ๊ฐœ์ˆ˜ N, ๊ณจ๋ชฉ ๊ฐœ์ˆ˜ M, ์‹œ์ž‘ ๊ต์ฐจ๋กœ ๋ฒˆํ˜ธ A, ๋„์ฐฉ ๊ต์ฐจ๋กœ ๋ฒˆํ˜ธ B, ๊ฐ€์ง„ ๋ˆ C ๊ฐ€ ๊ณต๋ฐฑ์œผ๋กœ ๊ตฌ๋ถ„๋˜์–ด ์ฃผ์–ด์ง„๋‹ค. ์ด์–ด์„œ M ๊ฐœ์˜ ์ค„์— ๊ฑธ์ณ์„œ ๊ฐ ๊ณจ๋ชฉ์ด ์ž‡๋Š” ๊ต์ฐจ๋กœ 2๊ฐœ์˜ ๋ฒˆํ˜ธ์™€, ๊ณจ๋ชฉ์˜ ์ˆ˜๊ธˆ์•ก์ด ๊ณต๋ฐฑ์œผ๋กœ ๊ตฌ๋ถ„๋˜์–ด ์ฃผ์–ด์ง„๋‹ค. ๊ฐ™์€ ๊ต์ฐจ๋กœ๋ฅผ ์ž‡๋Š” ๊ณจ๋ชฉ์€ ์ตœ๋Œ€ ํ•œ ๋ฒˆ๋งŒ ์ฃผ์–ด์ง€๋ฉฐ, ๊ณจ๋ชฉ์€ ์–‘๋ฐฉํ–ฅ์ด๋‹ค.

 

โ–ธ ์ถœ๋ ฅ

ํ˜ธ์„์ด๊ฐ€ ์ง€ํ‚ค๊ณ  ์žˆ๋Š” ๊ณจ๋ชฉ๋“ค์„ ํ†ตํ•ด์„œ ์‹œ์ž‘ ๊ต์ฐจ๋กœ์—์„œ ๋„์ฐฉ ๊ต์ฐจ๋กœ๊นŒ์ง€ C ์› ์ดํ•˜๋กœ ๊ฐ€๋Š” ๊ฒฝ๋กœ๋“ค ์ค‘์—, ์ง€๋‚˜๋Š” ๊ณจ๋ชฉ์˜ ์š”๊ธˆ์˜ ์ตœ๋Œ“๊ฐ’์˜ ์ตœ์†Ÿ๊ฐ’์„ ์ถœ๋ ฅํ•˜๋ผ. ๋งŒ์•ฝ ๊ฐˆ ์ˆ˜ ์—†๋‹ค๋ฉด -1์„ ์ถœ๋ ฅํ•œ๋‹ค.

 

โ–ธ ์ œํ•œ

1 ≤ N ≤ 100,000

1 ≤ M ≤ 500,000

1 ≤ C ≤ 1014

1 ≤ ๊ณจ๋ชฉ ๋ณ„ ์ˆ˜๊ธˆ์•ก ≤ 109

1 ≤ A, B  N, A  B

๊ณจ๋ชฉ์ด ์ž‡๋Š” ๊ต์ฐจ๋กœ์˜ ๋ฒˆํ˜ธ๋Š” ์„œ๋กœ ๋‹ค๋ฅด๋‹ค.

 

๐Ÿ“ ๋ฌธ์ œ ์ •๋ณด

  • ๐Ÿฅ‡ ๋ฌธ์ œ ๋ ˆ๋ฒจ : ๊ณจ๋“œ 2
  • ๐Ÿ””  ๋ฌธ์ œ ์œ ํ˜• : ๊ทธ๋ž˜ํ”„ ์ด๋ก , ์ด๋ถ„ ํƒ์ƒ‰, ์ตœ๋‹จ ๊ฒฝ๋กœ, ๋ฐ์ดํฌ์ŠคํŠธ๋ผ, ๋งค๊ฐœ ๋ณ€์ˆ˜ ํƒ์ƒ‰
  • ๐Ÿ’ฌ  ํ’€์ด ์–ธ์–ด : JAVA

 

๐Ÿค” ๋ฌธ์ œ ํ’€์ด

๋‹ค์ต์ŠคํŠธ๋ผ๋งŒ ์•Œ๊ณ ๋ฆฌ์ฆ˜๋งŒ์œผ๋กœ๋„ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๊ณ , ๋‹ค์ต์ŠคํŠธ๋ผ์™€ ์ด๋ถ„ ํƒ์ƒ‰์„ ์กฐํ•ฉํ•˜์—ฌ ํ•ด๊ฒฐํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

 

์ด ๋ฌธ์ œ๋Š” ํ•œ ๊ณจ๋ชฉ์—์„œ ๋‚ด์•ผ ํ•˜๋Š” ์ตœ๋Œ€ ์ˆ˜๊ธˆ์•ก์˜ ์ตœ์†Ÿ๊ฐ’์„ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ์ด๋‹ค.

ํŠนํžˆ, ์ˆ˜์น˜์‹ฌ์€ ๊ฒฝ๋กœ ์ƒ์—์„œ ๊ฐ€์žฅ ๋งŽ์ด ๋‚ธ ๋ˆ๊ณผ ๋น„๋ก€ํ•˜๋ฏ€๋กœ, ์ด๋ฅผ ์ตœ์†Œํ™”ํ•˜๋Š” ๊ฒฝ๋กœ๋ฅผ ์ฐพ๋Š” ๊ฒƒ์ด ๋ชฉํ‘œ๋‹ค.

 

๋จผ์ €, ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•ด์„œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ด ๋ณด์ž.

 

๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋ณดํ†ต ์ตœ์†Œ ๋น„์šฉ ๊ฒฝ๋กœ๋ฅผ ์ฐพ๋Š”๋ฐ ์‚ฌ์šฉ๋˜์ง€๋งŒ, ์ด ๋ฌธ์ œ์—์„œ๋Š” ๊ฒฝ๋กœ ์ƒ์—์„œ ๊ฐ€์žฅ ํฐ ์ˆ˜์น˜์‹ฌ์„ ์ตœ์†Œํ™”ํ•˜๋Š” ๊ฒฝ๋กœ๋ฅผ ์ฐพ์•„์•ผ ํ•œ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด ์ˆ˜์น˜์‹ฌ์˜ ์ตœ๋Œ“๊ฐ’์ด ์ž‘์€ ๊ฒฝ๋กœ๋ฅผ ์šฐ์„ ์ ์œผ๋กœ ํƒ์ƒ‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ •๋ ฌ ๊ธฐ์ค€์„ ์„ค์ •ํ•˜์˜€๋‹ค.

 

์‹œ์ž‘ ๊ต์ฐจ๋กœ a์—์„œ ์ถœ๋ฐœํ•˜์—ฌ ์šฐ์„ ์ˆœ์œ„ ํ๋ฅผ ์‚ฌ์šฉํ•ด ํƒ์ƒ‰์„ ์ง„ํ–‰ํ•œ๋‹ค.

์ด๋•Œ, ๊ฐ ๊ฒฝ๋กœ์—์„œ์˜ ์ˆ˜์น˜์‹ฌ์€ ํ˜„์žฌ๊นŒ์ง€์˜ ์ตœ๋Œ€ ์ˆ˜์น˜์‹ฌ๊ณผ ์ƒˆ๋กœ ์ด๋™ํ•  ๊ณจ๋ชฉ์˜ ์š”๊ธˆ ์ค‘ ํฐ ๊ฐ’์œผ๋กœ ๊ฐฑ์‹ ํ•œ๋‹ค.

๋ชจ๋“  ๊ต์ฐจ๋กœ์— ๋Œ€ํ•œ ์ˆ˜์น˜์‹ฌ์˜ ์ตœ๋Œ“๊ฐ’์€ dist ๋ฐฐ์—ด์— ์ €์žฅํ•˜๋ฉฐ, ๋” ๋‚˜์€ ์ˆ˜์น˜์‹ฌ ๊ฒฝ๋กœ๊ฐ€ ๋ฐœ๊ฒฌ๋˜๋ฉด ํ์— ์ถ”๊ฐ€ํ•ด ์ค€๋‹ค.

๋˜ํ•œ, ๋ˆ„์  ์š”๊ธˆ์ด ๊ฐ€์ง„ ๋ˆ c๋ฅผ ์ดˆ๊ณผํ•˜๋ฉด ํ•ด๋‹น ๊ฒฝ๋กœ๋Š” ํƒ์ƒ‰ํ•˜์ง€ ์•Š๋Š”๋‹ค.

 

ํƒ์ƒ‰ ์ค‘ ๋„์ฐฉ ๊ต์ฐจ๋กœ b์— ๋„๋‹ฌํ•˜๋ฉด, ํ•ด๋‹น ๊ฒฝ๋กœ์˜ ์ˆ˜์น˜์‹ฌ ์ตœ๋Œ“๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

๋งŒ์•ฝ ์šฐ์„ ์ˆœ์œ„ ํ๋ฅผ ๋ชจ๋‘ ํƒ์ƒ‰ํ•œ ๋’ค์—๋„ ๋„์ฐฉ ๊ต์ฐจ๋กœ์— ๋„์ฐฉํ•˜์ง€ ๋ชปํ•˜๋ฉด -1์„ ์ถœ๋ ฅํ•œ๋‹ค.

 

 

 

๋‘ ๋ฒˆ์งธ๋กœ๋Š” ๋‹ค์ต์ŠคํŠธ๋ผ์™€ ์ด๋ถ„ ํƒ์ƒ‰์„ ์กฐํ•ฉํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ด ๋ณด์ž.

 

๋จผ์ €, ์ด๋ถ„ ํƒ์ƒ‰์„ ์ง„ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ์ˆ˜์น˜์‹ฌ์˜ ๋ฒ”์œ„๋ฅผ ์„ค์ •ํ•œ๋‹ค. (์ตœ์†Œ ์ˆ˜์น˜์‹ฌ = 1, ์ตœ๋Œ€ ์ˆ˜์น˜์‹ฌ = 1,000,000,000)

๊ทธ๋‹ค์Œ, ์ค‘๊ฐ„๊ฐ’(mid)์„ ๊ธฐ์ค€์œผ๋กœ ํ•œ ๊ณจ๋ชฉ์—์„œ ํ—ˆ์šฉ ๊ฐ€๋Šฅํ•œ ์ตœ๋Œ€ ์ˆ˜์น˜์‹ฌ์„ ์„ค์ •ํ•˜๊ณ , ๋‹ค์ต์ŠคํŠธ๋ผ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ mid ์ดํ•˜์˜ ์ˆ˜์น˜์‹ฌ์œผ๋กœ๋งŒ ์‹œ์ž‘ ๊ต์ฐจ๋กœ์—์„œ ๋ชฉํ‘œ ๊ต์ฐจ๋กœ๊นŒ์ง€ ์ด๋™ ๊ฐ€๋Šฅํ•œ์ง€ ํƒ์ƒ‰ํ•œ๋‹ค. ์ด ๊ณผ์ •์—์„œ ์ˆ˜์น˜์‹ฌ์ด mid๋ฅผ ์ดˆ๊ณผํ•˜๋Š” ๊ณจ๋ชฉ์€ ํƒ์ƒ‰ ๋Œ€์ƒ์—์„œ ์ œ์™ธํ•œ๋‹ค.

 

ํƒ์ƒ‰ ๊ฒฐ๊ณผ, ๋ˆ„์  ๋น„์šฉ์ด ๊ฐ€์ง„ ๋ˆ c๋ฅผ ์ดˆ๊ณผํ•˜๋Š” ๊ฒฝ์šฐ, ํ˜„์žฌ mid ๊ฐ’์œผ๋กœ๋Š” ๋ชฉํ‘œ ๊ต์ฐจ๋กœ์— ๋„๋‹ฌํ•  ์ˆ˜ ์—†์Œ์„ ์˜๋ฏธํ•˜๋ฏ€๋กœ ๋” ํฐ ์ˆ˜์น˜์‹ฌ ๊ฐ’์„ ํƒ์ƒ‰ํ•œ๋‹ค.

๋ฐ˜๋Œ€๋กœ, ์ด๋™์ด ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ์—๋Š” ๋” ์ž‘์€ mid ๊ฐ’์„ ํƒ์ƒ‰ํ•˜์—ฌ ์ˆ˜์น˜์‹ฌ์˜ ์ตœ๋Œ“๊ฐ’์„ ์ค„์ธ๋‹ค.

 

์ด ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•˜๋ฉด์„œ, ๋ชฉํ‘œ ๊ต์ฐจ๋กœ์— ๋„๋‹ฌ ๊ฐ€๋Šฅํ•œ ์ตœ์†Œ ์ˆ˜์น˜์‹ฌ์˜ ์ตœ๋Œ“๊ฐ’์„ ์ฐพ๋Š”๋‹ค.

 

๋‹ค์ต์ŠคํŠธ๋ผ์™€ ์ด๋ถ„ ํƒ์ƒ‰์„ ์กฐํ•ฉํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ๋•Œ, ๋ฌธ์ œ์— ์ฃผ์–ด์ง„ ์ž…๋ ฅ ๊ฐ’์˜ ๋ฒ”์œ„๋ฅผ ์ž˜ ํ™•์ธํ•˜๊ณ , ์ด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํƒ์ƒ‰ ๋ฒ”์œ„๋ฅผ ์ ์ ˆํ•˜๊ฒŒ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค.

 

๋‘ ๊ฐ€์ง€ ํ’€์ด๋ฅผ ์ฝ”๋“œ๋กœ ๊ฐ๊ฐ ์ž‘์„ฑํ•ด ๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

 

โœ” ์ตœ์ข… ์ฝ”๋“œ - ๋‹ค์ต์ŠคํŠธ๋ผ

๋ฉ”๋ชจ๋ฆฌ : 223584KB
์‹œ๊ฐ„ : 932ms

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.PriorityQueue;
import java.util.StringTokenizer;

public class Main {
    static int n, m, a, b;
    static long c;
    static ArrayList<ArrayList<Pos>> list;
    static public class Pos implements Comparable<Pos> {
        int end; long dist; long shy;
        public Pos(int end, long dist) {
            this.end = end; this.dist = dist;
        }
        public Pos(int end, long dist, long shy) {
            this.end = end; this.dist = dist; this.shy = shy;
        }
        // ์ˆ˜์น˜์‹ฌ์ด ์ž‘์€ ๊ฒƒ์„ ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌ
        @Override
        public int compareTo(Pos o) {
            return Long.compare(this.shy, o.shy);
        }
    }
    static final Long INF = Long.MAX_VALUE;
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        n = Integer.parseInt(st.nextToken()); // ๊ต์ฐจ๋กœ ๊ฐœ์ˆ˜
        m = Integer.parseInt(st.nextToken()); // ๊ณจ๋ชฉ ๊ฐœ์ˆ˜
        a = Integer.parseInt(st.nextToken()); // ์‹œ์ž‘ ๊ต์ฐจ๋กœ ๋ฒˆํ˜ธ
        b = Integer.parseInt(st.nextToken()); // ๋„์ฐฉ ๊ต์ฐจ๋กœ ๋ฒˆํ˜ธ
        c = Long.parseLong(st.nextToken()); // ๊ฐ€์ง„ ๋ˆ

        list = new ArrayList<>();
        for (int i = 0; i <= n; i++) {
            list.add(new ArrayList<>());
        }
        int u, v, w;
        for (int i = 0; i < m; i++) {
            st = new StringTokenizer(br.readLine());
            u = Integer.parseInt(st.nextToken());
            v = Integer.parseInt(st.nextToken());
            w = Integer.parseInt(st.nextToken());
            // ์–‘๋ฐฉํ–ฅ ๋„๋กœ
            list.get(u).add(new Pos(v, w));
            list.get(v).add(new Pos(u, w));
        }

        System.out.println(dijkstra(a)); // ์‹œ์ž‘ ๊ต์ฐจ๋กœ
    }

    private static long dijkstra(int a) {
        PriorityQueue<Pos> pq = new PriorityQueue<>();
        pq.offer(new Pos(a, 0, 0));
        long[] dist = new long[n+1]; // ๊ฐ€์žฅ ์ž‘์€ ์ˆ˜์น˜์‹ฌ์˜ ์ตœ๋Œ“๊ฐ’
        Arrays.fill(dist, INF);
        dist[a] = 0;

        while (!pq.isEmpty()) {
            Pos now = pq.poll();
			
            // ๋„์ฐฉ์ 
            if (now.end == b) return dist[b];
			
            // ์ด๋ฏธ ์ €์žฅ๋œ ์ตœ์ ์˜ ๊ฒฝ๋กœ๋ณด๋‹ค ๋” ํฐ ๋น„์šฉ์„ ์œ ๋ฐœํ•˜๋Š” ๊ฒฝ์šฐ
            // ํ˜„์žฌ ๊ฒฝ๋กœ๋ฅผ ํƒ์ƒ‰ ํ•  ํ•„์š” ์—†์Œ
            // ์ฆ‰, ํ˜„์žฌ ์œ„์น˜์˜ ๊ฐ€์žฅ ์ž‘์€ ์ˆ˜์น˜์‹ฌ์˜ ์ตœ๋Œ“๊ฐ’์„ ๊ตฌํ–ˆ์œผ๋ฏ€๋กœ
            // now.shy ๊ฐ’์ด ๋” ํฌ๋‹ค๋ฉด ํƒ์ƒ‰ํ•  ํ•„์š” X
            if (dist[now.end] < now.shy) continue;

            for (Pos next : list.get(now.end)) {
            	// ์†Œ์ง€ํ•œ ๋ˆ ๋ณด๋‹ค ๋ˆ„์  ์ง€๋ถˆ ๊ธˆ์•ก์ด ํฌ๋‹ค๋ฉด ๊ฐˆ ์ˆ˜ ์—†์Œ
                if (now.dist + next.dist > c) continue;
            	// ๊ฒฝ๋กœ์—์„œ ์ˆ˜์น˜์‹ฌ ์ตœ๋Œ“๊ฐ’ ๊ฐฑ์‹ 
                if (dist[next.end] > Math.max(dist[now.end], next.dist)) {
                    dist[next.end] = Math.max(dist[now.end], next.dist);
                    pq.offer(new Pos(next.end, now.dist + next.dist, dist[next.end]));
                }
            }
        }
        
        // ๊ฐˆ ์ˆ˜ ์—†๋‹ค๋ฉด
        return -1;
    }
}

 

โœ” ์ตœ์ข… ์ฝ”๋“œ - ๋‹ค์ต์ŠคํŠธ๋ผ + ์ด๋ถ„ํƒ์ƒ‰

๋ฉ”๋ชจ๋ฆฌ : 344488KB
์‹œ๊ฐ„ : 3844ms
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.PriorityQueue;
import java.util.StringTokenizer;

public class Main {
    static int n, m, a, b;
    static long c;
    static ArrayList<ArrayList<Pos>> list;
    static public class Pos implements Comparable<Pos> {
        int end; long dist;
        public Pos(int end, long dist) {
            this.end = end; this.dist = dist;
        }
        @Override
        public int compareTo(Pos o) {
            return Long.compare(this.dist, o.dist);
        }
    }
    static final int INF = 1_000_000_007;
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        n = Integer.parseInt(st.nextToken()); // ๊ต์ฐจ๋กœ ๊ฐœ์ˆ˜
        m = Integer.parseInt(st.nextToken()); // ๊ณจ๋ชฉ ๊ฐœ์ˆ˜
        a = Integer.parseInt(st.nextToken()); // ์‹œ์ž‘ ๊ต์ฐจ๋กœ ๋ฒˆํ˜ธ
        b = Integer.parseInt(st.nextToken()); // ๋„์ฐฉ ๊ต์ฐจ๋กœ ๋ฒˆํ˜ธ
        c = Long.parseLong(st.nextToken()); // ๊ฐ€์ง„ ๋ˆ

        list = new ArrayList<>();
        for (int i = 0; i <= n; i++) {
            list.add(new ArrayList<>());
        }
        int u, v, w;
        for (int i = 0; i < m; i++) {
            st = new StringTokenizer(br.readLine());
            u = Integer.parseInt(st.nextToken());
            v = Integer.parseInt(st.nextToken());
            w = Integer.parseInt(st.nextToken());
            // ์–‘๋ฐฉํ–ฅ ๋„๋กœ
            list.get(u).add(new Pos(v, w));
            list.get(v).add(new Pos(u, w));
        }

        System.out.println(dijkstra(a));
    }

    private static long dijkstra(int a) {
        PriorityQueue<Pos> pq = new PriorityQueue<>();

        int start = 1; // ์ตœ์†Œ ์ˆ˜์น˜์‹ฌ
        int end = 1_000_000_000; // ์ตœ๋Œ€ ์ˆ˜์น˜์‹ฌ
        long ans = INF;
        while (start <= end) {
            // ํ•œ ๊ณจ๋ชฉ์—์„œ ํ—ˆ์šฉ ๊ฐ€๋Šฅํ•œ ์ˆ˜์น˜์‹ฌ ์ตœ๋Œ“๊ฐ’
            // mid ์ดํ•˜์˜ ์ˆ˜๊ธˆ์•ก๋งŒ ์‚ฌ์šฉํ•ด ๊ฒฝ๋กœ๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ๋Š”์ง€ ํŒ๋‹จ
            int mid = start + (end-start) / 2;
            long[] dist = new long[n+1];
            Arrays.fill(dist, 600_000_000_000_000L);
            pq.offer(new Pos(a, 0));
            dist[a] = 0;
            while (!pq.isEmpty()) {
                Pos now = pq.poll();
                // ์ด๋ฏธ ์ €์žฅ๋œ ์ตœ์ ์˜ ๊ฒฝ๋กœ๋ณด๋‹ค ๋” ํฐ ๋น„์šฉ์„ ์œ ๋ฐœํ•˜๋Š” ๊ฒฝ์šฐ
                // ํ˜„์žฌ ๊ฒฝ๋กœ๋ฅผ ๋” ํƒ์ƒ‰ ํ•  ํ•„์š” ์—†์Œ
                if (dist[now.end] < now.dist) continue;
                for (Pos next : list.get(now.end)) {
                    // ๊ณจ๋ชฉ์˜ ์ˆ˜๊ธˆ์•ก์ด mid๋ณด๋‹ค ํฌ๋‹ค๋ฉด ํŒจ์Šค
                    if (next.dist > mid) continue;
                    if (dist[next.end] > now.dist + next.dist) {
                        dist[next.end] = now.dist + next.dist;
                        pq.offer(new Pos(next.end, dist[next.end]));
                    }
                }
            }
            
            if (dist[b] > c) { // ๊ฐ€์ง„ ๋ˆ์œผ๋กœ ์ด๋™ ๋ถˆ๊ฐ€ํ•˜๋‹ค๋ฉด ์ˆ˜์น˜์‹ฌ ์ฆ๊ฐ€ํ•˜์—ฌ ํƒ์ƒ‰
                start = mid+1;
            } else { // ์ด๋™ ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด ๋” ์ž‘์€ ์ˆ˜์น˜์‹ฌ ํƒ์ƒ‰
                ans = mid;
                end = mid-1;
            }
        }

        // ๊ฐ€๋Šฅํ•œ ๊ฒฝ๋กœ๊ฐ€ ์—†๋‹ค๋ฉด -1
        ans = ans == INF ? -1 : ans;
        return ans;
    }
}

 

๋‹ค์ต์ŠคํŠธ๋ผ๋งŒ์œผ๋กœ๋„ ํ’€ ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ์˜€์ง€๋งŒ, ๋‹ค์ต์ŠคํŠธ๋ผ์™€ ์ด๋ถ„ ํƒ์ƒ‰์„ ์กฐํ•ฉํ•ด์„œ๋„ ํ’€ ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ๋ผ ์ƒˆ๋กญ๊ณ  ์žฌ๋ฐŒ์—ˆ๋‹ค.

ํ•ด๊ฒฐ ์™„๋ฃŒ ! ๐Ÿ”ฅ