結果
| 問題 |
No.848 なかよし旅行
|
| コンテスト | |
| ユーザー |
yakamoto
|
| 提出日時 | 2019-07-12 01:29:18 |
| 言語 | Scala(Beta) (3.6.2) |
| 結果 |
TLE
|
| 実行時間 | - |
| コード長 | 5,553 bytes |
| コンパイル時間 | 12,223 ms |
| コンパイル使用メモリ | 276,616 KB |
| 実行使用メモリ | 186,324 KB |
| 最終ジャッジ日時 | 2024-07-02 05:49:14 |
| 合計ジャッジ時間 | 18,939 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | -- * 4 |
| other | TLE * 1 -- * 25 |
ソースコード
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 = map(N)(dijk(g, _))
var ans = -1L
if (D(0)(P) + D(0)(Q) + D(P)(Q) <= T) {
ans = T
} else {
REP(N) { i =>
REP(N) { j =>
// 0 -> i -> P/Q -> j -> 0
val separeted = max(D(P)(i) + D(P)(j), D(Q)(i) + D(Q)(j))
val t = D(0)(i) + separeted + D(0)(j)
if (t <= T) ans = max(ans, T - separeted)
}
}
}
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
}
case class Visit(node: Int, cost: Long) extends Comparable[Visit] {
override def compareTo(o: Visit): Int = java.lang.Long.compare(cost, o.cost)
}
val queue = new java.util.PriorityQueue[Visit](1e5.toInt) // 使い回す
def dijk(g: WUGraph, start: Int): Array[Long] = {
val d = Array.fill[Long](g.length)(Long.MaxValue / 2)
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