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 |
|
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 |