結果
| 問題 |
No.848 なかよし旅行
|
| コンテスト | |
| ユーザー |
yakamoto
|
| 提出日時 | 2019-07-12 01:15:31 |
| 言語 | Scala(Beta) (3.6.2) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 5,459 bytes |
| コンパイル時間 | 13,136 ms |
| コンパイル使用メモリ | 276,016 KB |
| 実行使用メモリ | 81,332 KB |
| 最終ジャッジ日時 | 2024-07-02 05:48:53 |
| 合計ジャッジ時間 | 29,773 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | -- * 4 |
| other | AC * 4 WA * 7 TLE * 1 -- * 14 |
ソースコード
object Main {
import java.io.{BufferedReader, InputStream, InputStreamReader}
import java.util.StringTokenizer
import scala.reflect.ClassTag
def main(args: Array[String]): Unit = {
val out = new java.io.PrintWriter(System.out)
new Main(out, new InputReader(System.in)).solve()
out.flush()
}
private val oj = System.getenv("ATCODER_DEBUG") == null
def DEBUG(f: => Unit): Unit = {
if (!oj){ f }
}
def debug(as: Array[Boolean]): Unit = if (!oj){ debug(as.map(x => if(x) "1" else "0").mkString) }
def debug(as: Array[Int]): Unit = if (!oj){ debug(as.mkString(" ")) }
def debug(as: Array[Long]): Unit =if (!oj){ debug(as.mkString(" ")) }
def debugDim(m: Array[Array[Long]]): Unit = if (!oj){
REP(m.length) { i =>
debug(m(i))
}
}
def debugDimFlip(m: Array[Array[Long]]): Unit = if (!oj){
REP(m(0).length) { j =>
REP(m.length) { i =>
System.err.print(m(i)(j))
System.err.print(" ")
}
System.err.println()
}
}
def debug(s: => String): Unit = DEBUG {
System.err.println(s)
}
def debugL(num: => Long): Unit = DEBUG {
System.err.println(num)
}
class InputReader(val stream: InputStream) {
private val reader = new BufferedReader(new InputStreamReader(stream), 32768)
private var tokenizer: StringTokenizer = _
def next(): String = {
while (tokenizer == null || !tokenizer.hasMoreTokens)
tokenizer = new StringTokenizer(reader.readLine)
tokenizer.nextToken
}
def nextInt(): Int = Integer.parseInt(next())
def nextLong(): Long = java.lang.Long.parseLong(next())
def nextChar(): Char = next().charAt(0)
def ni(): Int = nextInt()
def nl(): Long = nextLong()
def nc(): Char = nextChar()
def ns(): String = next()
def ns(n: Int): Array[Char] = ns().toCharArray
def na(n: Int, offset: Int = 0): Array[Int] = map(n)(_ => ni() + offset)
def na2(n: Int, offset: Int = 0): (Array[Int], Array[Int]) = {
val A1, A2 = Array.ofDim[Int](n)
REP(n) { i =>
A1(i) = ni() + offset
A2(i) = ni() + offset
}
(A1, A2)
}
def nm(n: Int, m: Int): Array[Array[Int]] = {
val A = Array.ofDim[Int](n, m)
REP(n) { i =>
REP(m) { j =>
A(i)(j) = ni()
}
}
A
}
def nal(n: Int): Array[Long] = map(n)(_ => nl())
def nm_c(n: Int, m: Int): Array[Array[Char]] = map(n) (_ => ns(m))
}
def REP(n: Int, offset: Int = 0)(f: Int => Unit): Unit = {
var i = offset
val N = n + offset
while(i < N) { f(i); i += 1 }
}
def REP_r(n: Int, offset: Int = 0)(f: Int => Unit): Unit = {
var i = n - 1 + offset
while(i >= offset) { f(i); i -= 1 }
}
def TO(from: Int, to: Int)(f: Int => Unit): Unit = {
REP(to - from + 1, from) { i =>
f(i)
}
}
def map[@specialized A: ClassTag](n: Int, offset: Int = 0)(f: Int => A): Array[A] = {
val res = Array.ofDim[A](n)
REP(n)(i => res(i) = f(i + offset))
res
}
def sumL(as: Array[Int]): Long = {
var s = 0L
REP(as.length)(i => s += as(i))
s
}
def cumSum(as: Array[Int]): Array[Long] = {
val cum = Array.ofDim[Long](as.length + 1)
REP(as.length) { i =>
cum(i + 1) = cum(i) + as(i)
}
cum
}
}
class Main(out: java.io.PrintWriter, sc: Main.InputReader) {
import sc._
import Main._
import java.util.Arrays.sort
import scala.collection.mutable
import math.{abs, max, min}
import mutable.ArrayBuffer
// toIntとか+7とかするならvalにしろ
@inline private def MOD = 1000000007
def solve(): Unit = {
val N, M = ni()
val P, Q = ni() - 1
val T = ni()
val from, to, w = Array.ofDim[Int](M)
REP(M) { i =>
val a, b = ni() - 1
val c = ni()
from(i) = a
to(i) = b
w(i) = c
}
val g = packWUGraph(N, from, to, w)
val D = dijk(g, 0)
val Dp = dijk(g, P)
var ans = -1
if (D(P) + D(Q) + Dp(Q) <= T) {
ans = T
} else {
REP(N) { i =>
val Di = dijk(g, i)
val separated = max(Di(P), Di(Q)) * 2
if (T >= separated + D(i) * 2) {
ans = max(ans, T - separated)
}
}
}
out.println(ans)
}
case class Edge(to: Int, weight: Int)
type WUGraph = Array[Array[Edge]]
def packWUGraph(n: Int, from: Array[Int], to: Array[Int], w: Array[Int]): WUGraph = {
val g = new Array[Array[Edge]](n)
val p = new Array[Int](n)
val m = from.length
REP(m)(i => p(from(i)) += 1)
REP(m)(i => p(to(i)) += 1)
REP(n)(i => g(i) = new Array(p(i)))
REP(m) { i =>
p(from(i)) -= 1
g(from(i))(p(from(i))) = Edge(to(i), w(i))
p(to(i)) -= 1
g(to(i))(p(to(i))) = Edge(from(i), w(i))
}
g
}
def dijk(g: WUGraph, start: Int): Array[Int] = {
val d = Array.fill[Int](g.length)(Int.MaxValue / 2)
case class Visit(node: Int, cost: Int) extends Comparable[Visit] {
override def compareTo(o: Visit): Int = Integer.compare(cost, o.cost)
}
val queue = new java.util.PriorityQueue[Visit]()
d(start) = 0
queue.add(Visit(start, 0))
while(!queue.isEmpty) {
val v = queue.poll()
if (d(v.node) == v.cost) {
REP(g(v.node).length) { i =>
val e = g(v.node)(i)
val next = v.cost + e.weight
if (d(e.to) > next) {
d(e.to) = next
queue.add(Visit(e.to, next))
}
}
}
}
d
}
}
yakamoto