Submission #1777644


Source Code Expand

import Data.List
import Data.IORef
import Data.Array
import Data.Array.IO
import Control.Monad

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

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

calc :: Nodes -> IO ()
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


calcCost :: Int -> Nodes -> IO 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

setNode :: Int -> Int -> Int -> Nodes -> 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 ()

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

    list <- 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 2406 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 1 ms 508 KB
sample_02.txt AC 1 ms 508 KB
sample_03.txt AC 1 ms 508 KB
test_01.txt AC 1 ms 508 KB
test_02.txt AC 287 ms 10620 KB
test_03.txt TLE 5257 ms 35196 KB
test_04.txt AC 217 ms 5500 KB
test_05.txt AC 4567 ms 17788 KB
test_06.txt AC 240 ms 4476 KB
test_07.txt TLE 5256 ms 29052 KB
test_08.txt AC 10 ms 1788 KB
test_09.txt AC 3087 ms 12668 KB
test_10.txt AC 188 ms 3452 KB
test_11.txt AC 230 ms 4476 KB
test_12.txt AC 618 ms 7548 KB
test_13.txt AC 249 ms 4476 KB
test_14.txt AC 454 ms 7548 KB
test_15.txt TLE 5257 ms 27004 KB
test_16.txt AC 521 ms 5500 KB
test_17.txt AC 3413 ms 14716 KB
test_18.txt AC 623 ms 9596 KB
test_19.txt AC 615 ms 6524 KB
test_20.txt AC 423 ms 5500 KB
test_21.txt AC 2 ms 892 KB
test_22.txt AC 398 ms 4604 KB
test_23.txt AC 5 ms 1276 KB
test_24.txt AC 274 ms 10620 KB
test_25.txt AC 276 ms 10620 KB
test_26.txt AC 66 ms 5628 KB
test_27.txt AC 86 ms 5500 KB
test_28.txt AC 274 ms 10620 KB
test_29.txt AC 280 ms 10620 KB
test_30.txt AC 15 ms 1788 KB
test_31.txt AC 3 ms 1148 KB
test_32.txt AC 274 ms 10620 KB
test_33.txt AC 277 ms 10620 KB
test_34.txt AC 7 ms 1404 KB
test_35.txt AC 52 ms 3452 KB
test_36.txt AC 275 ms 10620 KB