Submission #1777840


Source Code Expand

import Data.List (maximumBy)
import Data.STRef (newSTRef, readSTRef, writeSTRef)
import Data.Array (Array)
import Data.Array.IO (IOArray, newArray, freeze, thaw)
import Data.Array.ST (STArray, readArray, writeArray, getBounds, getElems)
import Control.Monad (forM_, forM, replicateM_, when)
import Control.Monad.ST (ST, runST)

data Node = Node {
    edgesTO   :: [Int],
    edgesCost :: [Int],
    nodeDone  :: Bool,
    nodeCost  :: Int
    } deriving (Show, Eq)
type FNodes = (Array Int Node)
type IONodes = IOArray Int Node
type Nodes s = STArray s Int Node

getDoneNodeIndex :: Nodes s -> ST s Int
getDoneNodeIndex nodes = do
    doneIndex <- newSTRef (-1::Int)
    (a,b) <- getBounds nodes
    forM_ [a..b] $ \i -> do
        n <- readArray nodes i
        x <- readSTRef doneIndex
        when (not (nodeDone n) && nodeCost n >= 0) $
            if x < 0
                then writeSTRef doneIndex i
                else do
                    d <- readArray nodes x
                    when (nodeCost n < nodeCost d) $ writeSTRef doneIndex i
    readSTRef doneIndex

calc :: Nodes s -> ST s ()
calc nodes = do
    i <- getDoneNodeIndex nodes
    when (i > 0) $ do
        done <- readArray nodes i
        writeArray nodes i (done { nodeDone = True })
        forM_ [0 .. length (edgesTO done) - 1] $ \x -> do
            let to      = edgesTO done !! x
            let cost    = nodeCost done + edgesCost done !! x
            node <- readArray nodes to
            when (nodeCost node < 0 || cost < nodeCost node) $ writeArray nodes to (node { nodeCost = cost } )
        calc nodes

setNode :: Int -> Int -> Int -> IONodes -> IO ()
setNode n to cost nodes = do
    n1 <- readArray nodes n
    writeArray nodes n (n1 { edgesTO =  edgesTO n1 ++ [to], edgesCost = edgesCost n1 ++ [cost] })
    n2 <- readArray nodes to
    writeArray nodes to (n2 { edgesTO = edgesTO n2 ++ [n], edgesCost = edgesCost n2 ++ [cost] })
    return ()

calcCost :: Int -> Nodes s -> ST s Int
calcCost start nodes = do
    s <- readArray nodes start
    writeArray nodes start (s { nodeCost = 0 })
    calc nodes
    list <- getElems nodes
    return $ nodeCost $ maximumBy (\a b -> compare (nodeCost a) (nodeCost b)) list

main :: IO ()
main = do
    [n,m] <- map read . words <$> getLine :: IO [Int]
    input <- newArray (1,n) (Node [] [] False (-1)) :: IO IONodes
    replicateM_ m $ do
        [a,b,t] <- map read . words <$> getLine
        setNode a b t input
    baseNodes <- freeze input :: IO FNodes

    let list = runST $
            forM [1..n] $ \i -> do
                nodes <- thaw baseNodes
                calcCost i nodes
    print $ minimum list

Submission Info

Submission Time
Task D - バスと避けられない運命
User atctk
Language Haskell (GHC 7.10.3)
Score 0
Code Size 2725 Byte
Status TLE
Exec Time 5257 ms
Memory 35196 KB

Judge Result

Set Name All
Score / Max Score 0 / 100
Status
AC × 36
TLE × 3
Set Name Test Cases
All sample_01.txt, sample_02.txt, sample_03.txt, test_01.txt, test_02.txt, test_03.txt, test_04.txt, test_05.txt, test_06.txt, test_07.txt, test_08.txt, test_09.txt, test_10.txt, test_11.txt, test_12.txt, test_13.txt, test_14.txt, test_15.txt, test_16.txt, test_17.txt, test_18.txt, test_19.txt, test_20.txt, test_21.txt, test_22.txt, test_23.txt, test_24.txt, test_25.txt, test_26.txt, test_27.txt, test_28.txt, test_29.txt, test_30.txt, test_31.txt, test_32.txt, test_33.txt, test_34.txt, test_35.txt, test_36.txt
Case Name Status Exec Time Memory
sample_01.txt AC 2 ms 508 KB
sample_02.txt AC 2 ms 508 KB
sample_03.txt AC 2 ms 508 KB
test_01.txt AC 1 ms 508 KB
test_02.txt AC 368 ms 9596 KB
test_03.txt TLE 5257 ms 35196 KB
test_04.txt AC 249 ms 5500 KB
test_05.txt AC 4961 ms 17788 KB
test_06.txt AC 247 ms 4348 KB
test_07.txt TLE 5257 ms 29052 KB
test_08.txt AC 11 ms 1788 KB
test_09.txt AC 3473 ms 12668 KB
test_10.txt AC 196 ms 4476 KB
test_11.txt AC 244 ms 3708 KB
test_12.txt AC 682 ms 9212 KB
test_13.txt AC 261 ms 3836 KB
test_14.txt AC 466 ms 5500 KB
test_15.txt TLE 5257 ms 27004 KB
test_16.txt AC 553 ms 5500 KB
test_17.txt AC 3760 ms 13692 KB
test_18.txt AC 675 ms 7548 KB
test_19.txt AC 598 ms 6524 KB
test_20.txt AC 423 ms 5500 KB
test_21.txt AC 2 ms 1020 KB
test_22.txt AC 420 ms 4476 KB
test_23.txt AC 6 ms 1276 KB
test_24.txt AC 361 ms 10620 KB
test_25.txt AC 361 ms 10620 KB
test_26.txt AC 84 ms 5500 KB
test_27.txt AC 111 ms 5500 KB
test_28.txt AC 359 ms 10620 KB
test_29.txt AC 361 ms 10620 KB
test_30.txt AC 19 ms 1916 KB
test_31.txt AC 3 ms 1148 KB
test_32.txt AC 361 ms 10620 KB
test_33.txt AC 361 ms 10620 KB
test_34.txt AC 8 ms 1404 KB
test_35.txt AC 65 ms 3452 KB
test_36.txt AC 361 ms 9596 KB