Submission #12077234


Source Code Expand

import           Control.Exception           (assert)
import           Control.Monad
import qualified Control.Monad.ST            as ST
import qualified Data.Array.IO               as IO
import qualified Data.Array.ST               as ST
import qualified Data.Array.Unboxed          as A
import           Data.Bits
import qualified Data.ByteString.Char8       as BS
import           Data.Char
import           Data.Foldable
import           Data.List
import           Data.Maybe
import qualified Data.Sequence               as Seq
import qualified Data.Set                    as Set
import qualified Data.Vector.Unboxed         as V
import qualified Data.Vector.Unboxed.Mutable as VM
import           Debug.Trace

readInt = fst . fromJust . BS.readInt
readIntList = map readInt . BS.words
getInt = readInt <$> BS.getLine
getIntList = readIntList <$> BS.getLine
getIntVec n = V.unfoldrN n (BS.readInt . BS.dropWhile isSpace) <$> BS.getLine

readInteger = fst . fromJust . BS.readInteger
readIntegerList = map readInteger . BS.words
getInteger = readInteger <$> BS.getLine
getIntegerList = readIntegerList <$> BS.getLine

type Edge = (Int, Int, Int)
eFrm  (frm, _, _)  = frm
eTo   (_, to, _)   = to
eCost (_, _, cost) = cost

longestPath :: Int -> V.Vector (Int, Int, Int) -> Int
  -> IO (V.Vector Int)
longestPath s edges numV = do
  let numE = V.length edges
      inf = 10^18 :: Int

  d <- VM.new numV
  VM.set d (-inf)
  VM.write d s 0

  let loop :: Int -> IO ()
      loop i | i > 2*numV = return ()
             | otherwise = do update <- loop2 (i >= numV) 0 False
                              if update
                                then loop (i+1)
                                else return ()

      loop2 :: Bool -> Int -> Bool -> IO Bool
      loop2 cyc j upd
        | j == V.length edges = return upd
        | otherwise = do
            let e = edges V.! j
            d_frm <- VM.read d (eFrm e)
            d_to  <- VM.read d (eTo e)
            let ucond = d_frm /= (-inf) && d_to < d_frm + eCost e
                upd' = upd || ucond
            when (ucond && not cyc) $
              VM.write d (eTo e) (min inf (d_frm + eCost e))
            when (ucond && cyc) $ VM.write d (eTo e) inf
            loop2 cyc (j+1) upd'

  loop 0
  res <- V.freeze d
  return res

main = do
  [n, m] <- getIntList
  edges <- V.replicateM m $ do
    [a, b, c] <- getIntList
    return (a-1, b-1, c)

  costs <- longestPath 0 edges n
  let inf = 10^18 :: Int
      ans = costs V.! (n-1)
  if ans == inf then putStrLn "inf" else print ans

Submission Info

Submission Time
Task D - Score Attack
User unnohideyuki
Language Haskell (GHC 7.10.3)
Score 400
Code Size 2621 Byte
Status AC
Exec Time 59 ms
Memory 1148 KB

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 400 / 400
Status
AC × 3
AC × 30
Set Name Test Cases
Sample sample_01.txt, sample_02.txt, sample_03.txt
All sample_01.txt, sample_02.txt, sample_03.txt, subtask_1_1.txt, subtask_1_10.txt, subtask_1_11.txt, subtask_1_12.txt, subtask_1_13.txt, subtask_1_14.txt, subtask_1_15.txt, subtask_1_16.txt, subtask_1_17.txt, subtask_1_18.txt, subtask_1_19.txt, subtask_1_2.txt, subtask_1_20.txt, subtask_1_21.txt, subtask_1_22.txt, subtask_1_23.txt, subtask_1_24.txt, subtask_1_25.txt, subtask_1_26.txt, subtask_1_27.txt, subtask_1_3.txt, subtask_1_4.txt, subtask_1_5.txt, subtask_1_6.txt, subtask_1_7.txt, subtask_1_8.txt, subtask_1_9.txt
Case Name Status Exec Time Memory
sample_01.txt AC 2 ms 508 KB
sample_02.txt AC 2 ms 380 KB
sample_03.txt AC 2 ms 508 KB
subtask_1_1.txt AC 2 ms 1020 KB
subtask_1_10.txt AC 2 ms 636 KB
subtask_1_11.txt AC 6 ms 1020 KB
subtask_1_12.txt AC 31 ms 1020 KB
subtask_1_13.txt AC 2 ms 508 KB
subtask_1_14.txt AC 30 ms 1020 KB
subtask_1_15.txt AC 59 ms 1148 KB
subtask_1_16.txt AC 2 ms 508 KB
subtask_1_17.txt AC 2 ms 636 KB
subtask_1_18.txt AC 2 ms 1020 KB
subtask_1_19.txt AC 3 ms 1020 KB
subtask_1_2.txt AC 2 ms 1020 KB
subtask_1_20.txt AC 2 ms 508 KB
subtask_1_21.txt AC 2 ms 1020 KB
subtask_1_22.txt AC 3 ms 1020 KB
subtask_1_23.txt AC 2 ms 508 KB
subtask_1_24.txt AC 3 ms 1020 KB
subtask_1_25.txt AC 8 ms 1020 KB
subtask_1_26.txt AC 2 ms 1020 KB
subtask_1_27.txt AC 33 ms 1020 KB
subtask_1_3.txt AC 2 ms 1020 KB
subtask_1_4.txt AC 2 ms 1020 KB
subtask_1_5.txt AC 14 ms 1020 KB
subtask_1_6.txt AC 37 ms 1020 KB
subtask_1_7.txt AC 2 ms 1020 KB
subtask_1_8.txt AC 2 ms 1020 KB
subtask_1_9.txt AC 2 ms 380 KB