私はハスケルを初めて利用しています。私はコードをコンパイルし、メインシェルが開きます。私はグラフの端を入力して出力を得る方法を知らない。どんな助けもありがとう。ハスケルで書かれたベルマンフォードコードで入力と出力を与える方法がわかりません
グラフでソース頂点srcを指定すると、与えられたグラフのsrcからすべての頂点までの最短パスを見つけることができます。グラフには負のウェイトエッジが含まれている場合があります。
{-# LANGUAGE BangPatterns #-}
module Main where
import Control.DeepSeq
import Data.Functor
import Data.Int
import Data.Vector.Unboxed ((//))
import qualified Data.Vector.Unboxed as V
--import Debug.Trace
type Vertex = Int
type Dist = Int32
type Edge = (Vertex, Vertex, Dist)
type EdgeVec = V.Vector Edge
type CostVec = V.Vector Dist
readEdge :: String -> Edge
readEdge s = let [v1, v2, w] = words s
in (read v1, read v2, read w)
bfStep :: EdgeVec -> CostVec -> CostVec
bfStep edges !prev = V.unsafeAccumulate min prev $ V.map mincost edges
where
mincost :: Edge -> (Int, Int32)
mincost (s, h, c) = (h, cost s c)
cost w c = let precost = prev `V.unsafeIndex` w
in if precost == maxBound then maxBound else precost + c
mkEdgeVec :: Int -> [String] -> EdgeVec
mkEdgeVec nvert inp = V.unfoldr step (nvert, inp)
where
step (n, s:xs) = Just (readEdge s, (n, xs))
step (0, []) = Nothing
step (!n, []) = Just ((0, n, 0), (n - 1, []))
main :: IO()
main = do
header:body <- lines <$> getContents
let nvert = read $ head $ words header
let edgelist = mkEdgeVec nvert body
let bfbase = V.replicate (nvert + 1) maxBound // [(0, 0)]
print $ edgelist `deepseq` "running"
let bfout = iterate (bfStep edgelist) bfbase !! nvert
let bfcheck = bfStep edgelist bfout
let hasCycle = V.any id $ V.zipWith (/=) bfout bfcheck
putStrLn $ if hasCycle then "Cycle" else show $ V.minimum bfout
私はそれを取る "ベルマンフォード"ベルマンフォードのアルゴリズムですか?これは宿題のように聞こえるので、完全な答えではありませんが、割り当ては入力形式を指定していますか? – Davislor
データを含む入力ファイルを作成し、プログラムと同じディレクトリに 'input.txt'と呼んで、コンソールを起動し、実行可能ファイルの名前が' bellmanford'の場合はプログラムを 'bellmanford '
Davislor