ืืขืฆืืข ืืืืขืจ ืืื ืืขื ืืืขื ืึธื ืืืื ืืื
ืืื ืึท ืืึทืืืืืืงืืขืจ ืืื Google Summer of Code 2019, ืืื ืืืจืืืขืงืึธืื ืึท ืคึผืจืืืขืงื ืืื ืืขืจ ืืืืืืึธืืขืง
ืืื ืืขื ืคึผืึธืกืื ืืื ืืืขื ืจืขืื ืืืขืื ืืืื ืืืคึผืืึทืืขื ืืืืฉืึทื ืคืื ืึท ืึทืืืขืจืืืึทื ืคึฟืึทืจ ืงืึธื ืืจืึธืืืจืื ื ืึท ืืจืึทืคืืง ืคึฟืึทืจ ืืืืคึผืึทืจืืืืขื ืขืกืก ืืื Haskell. ืืคืืื ืืึธืืฉ ืื ืึทืืืขืจืืืึทื ืืื ืืืื ืขืจ ืคืื ืื ืืขืจืกื ืืงืขืจืืืง, ืืืคึผืืึทืืขื ืื ื ืขืก ืืืืืึทืคืื ืืื ืึท ืคืึทื ืืงืฉืึทื ืึทื ื ืืกื ืืื ืืืจ ืขืืืขืืข ืืืขืจืืืฉืึทื ื ืืื ืคืืจืืื ืื ืืึทื ืฅ ืึท ืคึผืืึทืฅ ืคืื ืึทืจืืขื. ืืื ืึท ืจืขืืืืืึทื, ืืื ืืขืืขืฆื ืืืืฃ ืึท ืืืคึผืืึทืืขื ืืืืฉืึทื ืืื ืืึธื ืึทื ืืจืึทื ืกืคืึธืจืืขืจืก.
ืืืขืื ืืื
ืืืื ื ืึธืืขื ืืื ืืืึทืกืืื ืึทืืคืขืจืึธืื, ืืื ืืื ืึท ืคืขืจื-ืืึธืจ ืชึผืืืื ืืื ืกื ืคืขืืขืจืืืจื ืืกืข. ืคืจืืขืจ ืืื ืืขื ืืืึธื ืืื ืืขืฉืจืืื
ืืืขืื ืื ืืืคึผืืึทืืขื ืืืืฉืึทื ืคืื ืื ืึทืืืขืจืืืึทื
ืืึทืืืึธืืข
ืกืืืืขื ืื ืืืึธืก ืึธื ืืืื ื ืขืืขื ืืื ืืขื ืคึผืจืึธืืจืึทื ืืขื ืขื ืฉืืืจืง ืื ืงืขืจืึทืืืฉื ืฆื ืืืึธื. ืืื ืืึธืื ืืืจ ืฆืืืขืฉืืขืื ืึท ืคึผืืึทืืคืึธืจืืข ืคึฟืึทืจ ืืขื ืืืึธื
ืฆืืขื ืืขืื ืืื ืื ืงืึธื ืืื ืงืฉืื ืงืขื ืขื ืืืื ืืขืคึฟืื ืขื
ืืืจ ืงืขื ื ืืืืขื ืขื ืืืขืื ืื ืจืขืืืืืึทืื ืคืื ืืืื ืึทืจืืขื (ืืื ืขื ืืืืฉ)
ืืขืจ ืคึผืึธืกืื ืึทืกืืื ืึทื ืืขืจ ืืืืขื ืขืจ ืืื ืืึทืงืึทื ื ืืื ืื ืืจืื ื ืงืึทื ืกืขืคึผืก ืืื ืคืึทื ืืงืฉืึทื ืึทื ืคึผืจืึธืืจืึทืืืื ื, ืืึธืืฉ ืืื ืืืขื ืคึผืจืืืืจื ืฆื ืฆืืจืืงืจืืคื ืึทืืข ืื ืืขืจืืื ืขื ืืขื ืืฆื ืืืขื ืื ืฆืืื ืงืืื.
ืงืึธื ืืจืึธืืืจืื ื ืืจืึทืคืก ืคึฟืึทืจ ืืืืคึผืึทืจืืืืขื ืขืกืก
ืึทื ืึทืืืขืจืืืึทื ืคึฟืึทืจ ืงืึธื ืืจืึธืืืจืื ื ืึท ืืจืึทืคืืง ืคึฟืึทืจ ืืืืคึผืึทืจืืืืขื ืขืกืก ืืื ืืืืฉืึทืืืึทืื ืืขืืขืื ืืื ืึท ืงืืจืก ืืืืฃ ืึทืืืขืจืืืึทืื ืืื ืืืื ืขืจ ืคืื ืื ืกืืืคึผืืึทืกื ืืจืึทืคืืง ืึทืืืขืจืืืึทืื. ืืืื ืืขืืึทื ืง ืืื ืกืืจืืืืคืึธืจืืืขืจื: ืขืจืฉืืขืจ ืืืจ ืขืคืขืก ืฉืืขืื ืืืขืจืืืกืขืก ืืื ืื ืืื ืงืก ืึธืืขืจ ืจืขืื ืืืืื, ืืื ืืืขื ืึท ืงืึทื ืคืืืงืืื ื ืืจืขื ืืื ืืขืคึฟืื ืขื, ืืืจ ืืึทืฉืืขืืืงื ืึทื ืื ืืจืึทืคืืง ืืื ื ืืฉื ืืืืคึผืึทืจืืื.
ื ืืืกื ืืขืจ ืืขืืึทื: ืขืจืฉืืขืจ ืืืจ ืฉืืขืื ืขืืืขืืข ืืืขืจืืขืงืก ืืื ืื ืืื ืงืก ืืืืื. ืืึธื, ืึทืืข ืื ืฉืื ืื ืคืื ืืขื ืืืขืจืืขืงืก ืืืื ืืืื ืืื ืื ืจืขืื ืืึธืื. ืฐืฒืืข ืจ ืืืจืค ื ืื ื ืื ืข ืฉืื ื ื ืคื ื ื ื ืฉืื ื ื ืคื ื ืืข ื ืืืืืง ื ืฐืืจืืงืก , ืืื ื ืื ื ืืข ืจ ืืื ืงืข ืจ ืืื ืข ืื ื ืืื ื ืฐืฒืืขืจ . ืืืจ ืคืึธืจืืขืฆื ืฆื ืืึทืฉืืืืขื ืฉืึทืจืขืก ืฆื ืืืขืจืืืกืขืก ืึทืืื ืืึทื ื ืืื ืขืก ืืขื ืขื ื ืึธื ืืืขืจืืืงืึทืื ืืื ืื ืคืืจืืื ืื ืงืึธืืคึผืึธื ืขื ื ืคืื ืื ืืืขืจืืขืงืก ืืื ืืืึธืก ืืืจ ืืึธืื ื ืืฉื ืึทืกืืื ื ืฉืื ืื. ืืืจ ืืขืืึธืื ืืืืขืจืืืจื ืืขื ืงืึทืืฃ ืคึฟืึทืจ ืึทืืข ืคืืจืืื ืื ืงืึทืืคึผืึธืื ืึทื ืฅ.
ืืืื ืขืก ืืื ืึท ืืจืขื ืฆืืืืฉื ืืืขืจืืืงืก ืืืึธืก ืคืึทืื ืืื ืืขืจ ืืขืืืืงืขืจ ืฆืขืืืืืื ื, ืขืก ืืื ื ืืฉื ืฉืืืขืจ ืฆื ืืขืคึฟืื ืขื ืึท ืืึธืื ืข ืฆืืงื ืืื ืื ืืจืึทืคืืง, ืืืึธืก ืืื ืืจืืื ืืืงืื ื (ืืื ืืึทื ืฅ ืืึธื) ืืืืืขืืืขื ืืื ืึท ืฆืืืืืคึผืึทืจืืืื ืืจืึทืคืืง. ืึทื ืืขืจืฉ, ืืืจ ืืึธืื ืึท ืจืืืืืง ืฆืขืืืืืื ื, ืืืึธืก ืืืื ืื ืืจืึทืคืืง ืืื ืืืืคึผืึทืจืืืืข.
ืืืคึผืืงืึทืืื, ืืขื ืึทืืืขืจืืืึทื ืืื ืืืคึผืืึทืืขื ืึทื ื ืืฆื
ืืื ื ืืขื ืข ื ืื ืจ ืืขืงืืืข ื ืฆ ื ืืข ืจ ืคืืืื ืืืงืข ืจ ืกืืขืืข . ืืืจ ืืืจืืคืึธืจ ืื ืืืขืจืืืกืขืก ืคืื ืื ืืจืึทืคืืง ื ืืฆื ืื ืขืจืฉืืขืจ ืืืื ืืื ืืึทืฉืืืืขื ืฉืึทืจืขืก ืฆื ืืื, ืืฉืึทื ืืื ื ืื ื ืืืขืจ ืคืื ืื ืืืืื ืืืขื ืืืจ ืืึทื ืืืืฃ ืืขื ืืจืขื. ืืืื ืืืจ ืคึผืจืืืืจื ืฆื ืืึทืฉืืืืขื ืึท ืฉืขืจ ืฆื ืึท ืืืขืจืืขืงืก ืืืึธืก ืฉืืื ืืื ืึท ืืืืื ืึทืกืืื ื, ืืืจ ืงืขื ืขื ืืขืฉืึธืืขื ืืึธืื ืึทื ืื ืืจืึทืคืืง ืืื ื ืืฉื ืืืืคึผืึทืจืืื. ืืขืจ ืืึธืืขื ื ืืืขื ืึทืืข ืืืขืจืืืกืขืก ืืขื ืขื ืึทืกืืื ื ืึท ืืืืื ืืื ืืืจ ืืึธืื ืืขืงืืงื ืืืืฃ ืึทืืข ืื ืขืืืฉืึทื, ืืืจ ืืึธืื ืึท ืืื ืฆืขืืืืืื ื.
ืจืืื ืงืืึทื ืคืื ืืฉืืื ืืช
ืืื ืืึทืกืงืขืื ืืืจ ืืืขืจื ืขืืขื ืึทื ืึทืืข ืืฉืืื ืืช ืืขื ืขื ืจืืื. ืึธืืขืจ, ืืืื ืืึธืก ืืื ืืืืช ืืขืจ ืคืึทื, ืืืจ ืืืึธืื ืืึธืื ืงืืื ืืืขื ืฆื ืืจืืงื ืขืคึผืขืก ืฆื ืื ืคืึทืจืฉืืขืื. ืืืื, ืจืืื ืืฉืืื ืืช ืืขื ืขื ืึทืืื ืคืืื ืึทื ืขืก ืืื ื ืื ืืืื ืขืจ ืจืืื ืกืืืืช ืฆื ืจืขืืขื ืขื ืขืคึผืขืก. ืึทืืข ืืฉืืื ืืช ืืืึธืก ืคืึทืื ืืื ืืขื ืคึผืจืึธืืจืึทื ืืขื ืขื ืขืคืขืก ืืขืฆืืืื ืืขื ืืื "ืืื" ืืึธื ืึทื IO.
ืืึธื ืึทืืก ืืขื ืขื ืึท ืืืขื ืฆื ืคืึธืจืฉืืขืื ืืฉืืื ืืช ืืื ืืืืจืงืื ื ืืื ืืืกืงืขื. ืืขืจืงืืขืจื ืืื ืืื ืึทืจืืขื ืืื ืืืืึทืืขืจ ืคืื ืืขื ืคืึทืจื ืขื ืคืื ืืขื ืคึผืึธืกืื. ื ืืืืข ืืื ืงืืืจืข ืืืฉืจืืืืื ื ืงืขื ืืขื ืืืืขื ืขื ืืืืฃ ืขื ืืืืฉ
ืืึธ ืืื ืืืืื ืฆื ืคืื ื ืืืืก ืึทื ืืฉืขืช ืขืืืขืืข ืืึธื ืึทืืก, ืึทืืึท ืืื ืืึธ, ืืขื ืขื ืืืคึผืืึทืืขื ืึทื ืืืจื ืงืึทืืคึผืืืืขืจ ืืึทืืืฉ, ืึผืืขื ืึทืืข ืื ืืขืจืข ืืขื ืขื ืืืคึผืืึทืืขื ืึทื ืืื ืืืืืืืืืจื ืืื ืึทืืข ืืฉืืื ืืช ืืื ืืื ืืขื ืขื ืจืืื.
ืขืก ืืขื ืขื ืคืืืข ืืคืขืงืฅ ืืื ืืขืืขืจ ืืื ืืืื ืืืืืขื ืข ืืึธื ืึทื. ืืึธืก ืืื ืึท ืืืืขืจ ืฉืืึทืจืง ืืื ืฉืืื ืืขืึธืจืืข: ืึทืืข ืืึธื ืึทืืก ืื ืกืืจืืืขื ื ืื ืืขืืืข ืฆืืืื ื. ืืืจ ืืืขืื ืจืขืื ืืืขืื ืื ืคืืืืขื ืืข ืืจืื ืืึธื ืึทืืก:
- ืึธืืขืจ ea ืืื ืึท ืืขืืฉืื ืืืึธืก ืงืขืจื ืึท ืืืขืจื ืคืื ืืืคึผ ืึท ืึธืืขืจ ืืืึทืจืคื ืึท ืืืกื ืขื ืคืื ืืืคึผ e. ืื ื ืึทืืืจ ืคืื ืืขื ืืึธื ืึทื ืืื ืืืืขืจ ืขื ืืขื ืฆื ืืืกื ืขื ืืึทื ืืืื ื ืืื ืืืคึผืขืจืึทืืืื ืฉืคึผืจืึทืื: ืขืจืจืึธืจืก ืงืขื ืขื ืืืื ืืขืืืคื ืึธืืขืจ ืืืจืืืขืืื ืืขื ืืืืฃ. ืืขืจ ืืืืคึผื ืืืืืง ืืื ืึทื ืื ืืึธื ืึทื ืืื ืืึธืจ ืืึทืืืฉืืงืื ืืืคึผืืึทืืขื ืึทื ืืื ืื ืกืืึทื ืืึทืจื ืืืืืืึธืืขืง ืืื Haskell, ืืฉืขืช ืืืคึผืขืจืึทืืืื ืฉืคึผืจืึทืื ืืืืฉืึทืืืึทืื ื ืืฆื ืึธืคึผืขืจืืืืื ื ืกืืกืืขื ืืขืงืึทื ืืืึทืื.
- ืฉืืึทื ืกืึท ืืื ืึท ืืขืืฉืื ืืืึธืก ืงืขืจื ืึท ืืืขืจื ืคืื ืืืคึผ ืึท ืืื ืืื ืึทืงืกืขืก ืฆื ืืืืืึทืืึทื ืฉืืึทื ืคืื ืืืคึผ s.
- ืืคืฉืจ ื. ืืขืจ ืืืึทืืข ืืึธื ืึทื ืืงืกืคึผืจืขืกืึทื ืึท ืงืึทืืคึผืืึทืืืืฉืึทื ืืืึธืก ืงืขื ืขื ืืืื ืื ืืขืจืึทืคึผืืื ืืื ืงืืื ืฆืืื ืืืจื ืฆืืจืืงืงืืืขื ืืึธืจื ืืฉื. ืึธืืขืจ, ืืืจ ืืืขืื ืจืขืื ืืืขืื ืื ืืืคึผืืึทืืขื ืืืืฉืึทื ืคืื ืื MonadPlus ืงืืึทืก ืคึฟืึทืจ ืื ืืคึฟืฉืจ ืืืคึผ, ืืืึธืก ืืงืกืคึผืจืขืกืึทื ืื ืคืึทืจืงืขืจื ืืืืจืงืื ื: ืขืก ืืื ืึท ืืขืืฉืื ืืืึธืก ืงืขื ืขื ืืืื ืื ืืขืจืึทืคึผืืื ืืื ืงืืื ืฆืืื ืืืจื ืฆืืจืืงืงืืืขื ืึท ืกืคึผืขืฆืืคืืฉ ืืืขืจื.
ืืืคึผืืึทืืขื ืืืืฉืึทื ืคืื ืื ืึทืืืขืจืืืึทื
ืืืจ ืืึธืื ืฆืืืื ืืึทืื ืืืืคึผืก, Graph a ืืื Bigraph ab, ืืขืจ ืขืจืฉืืขืจ ืคืื ืืืึธืก ืจืขืคึผืจืึทืืขื ืฅ ืืจืึทืคืก ืืื ืืืขืจืืืกืขืก ืืืืืึทืื ืืื ืืืึทืืืขืก ืคืื ืืืคึผ ืึท, ืืื ืื ืจืืข ืจืขืคึผืจืึทืืขื ืฅ ืืืืคึผืึทืจืืืืข ืืจืึทืคืก ืืื ืืื ืงืก-ืืืึทื ืืืขืจืืืกืขืก ืืืืืึทืื ืืื ืืืึทืืืขืก ืคืื ืืืคึผ ืึท ืืื ืจืขืื. -ืืืึทื ืืืขืจืืืกืขืก ืืืืืึทืื ืืื ืืืึทืืืขืก ืคืื ืืืคึผ ื.
ืืึธืก ืืขื ืขื ื ืืฉื ืืืืคึผืก ืคืื ืื ืึทืืืึท ืืืืืืึธืืขืง. ืึทืืืึท ืืื ื ืืฉื ืืึธืื ืึท ืคืึทืจืืจืขืืื ื ืคึฟืึทืจ ืึทื ืจืขืงืืื ืืืืคึผืึทืจืืืืข ืืจืึทืคืก. ืืื ืืขืืืื ืื ืืืืคึผืก ืืื ืืขื ืคึฟืึทืจ ืงืืขืจืืื.
ืืืจ ืืืขืื ืืืื ืืึทืจืคึฟื ืืขืืคึผืขืจ ืคืึทื ืืงืฉืึทื ื ืืื ืื ืคืืืืขื ืืข ืกืืื ืึทืืฉืขืจื:
-- ะกะฟะธัะพะบ ัะพัะตะดะตะน ะดะฐะฝะฝะพะน ะฒะตััะธะฝั.
neighbours :: Ord a => a -> Graph a -> [a]
-- ะะพัััะพะธัั ะดะฒัะดะพะปัะฝัะน ะณัะฐั ะฟะพ ะณัะฐัั ะธ ััะฝะบัะธะธ, ะดะปั ะบะฐะถะดะพะน ะฒะตััะธะฝั
-- ะฒัะดะฐััะตะน ะตั ะดะพะปั ะธ ะฟะพะผะตัะบั ะฒ ะฝะพะฒะพะน ะดะพะปะต, ะธะณะฝะพัะธััั ะบะพะฝัะปะธะบัะฝัะต ััะฑัะฐ.
toBipartiteWith :: (Ord a, Ord b, Ord c) => (a -> Either b c)
-> Graph a
-> Bigraph b c
-- ะกะฟะธัะพะบ ะฒะตััะธะฝ ะฒ ะณัะฐัะต
vertexList :: Ord a => Graph a -> [a]
ะกะธะณะฝะฐัััะฐ ััะฝะบัะธะธ, ะบะพัะพััั ะผั ะฑัะดะตะผ ะฟะธัะฐัั, ะฒัะณะปัะดะธั ัะฐะบ:
type OddCycle a = [a]
detectParts :: Ord a => Graph a -> Either (OddCycle a) (Bigraph a a)
ืขืก ืืื ืืจืื ื ืฆื ืืขื ืึทื ืืืื ืืืจ ืืขืคึฟืื ืขื ืึท ืงืึทื ืคืืืงืืื ื ืืจืขื ืืื ืืขืจ ืขืจืฉืืขืจ ืืืฃ ืืืื, ืื ืืึธืื ืข ืฆืืงื ืืืื ืืืืฃ ืฉืคึผืืฅ ืคืื ืื ืจืขืงืืจืกืืึธื ืึธื ืืืืื. ืืืื, ืฆื ืืืงืขืจื ืขืก, ืืืจ ืืึทืจืคึฟื ืฆื ืฉื ืืึทืื ืึทืืืขืง ืึทืืฅ ืคืื ืื ืจืขืงืืจืกืืึธื ืึธื ืืืืื ืฆื ืืขืจ ืขืจืฉืืขืจ ืคึผืึทืกืืจืื ื ืคืื ืื ืืขืฆืืข ืืืขืจืืขืงืก.
ืืืจ ืื ืกืืจืืืขื ื ืืืฃ-ืขืจืฉืืขืจ ืืืื ืืืจื ืืึทืืื ืึท ืึทืกืกืึธืกืืึทืืืืืข ืืขื ืืข ืคืื โโืืืืื ื ืืืขืจื ืคึฟืึทืจ ืืขืืขืจ ืืืขืจืืขืงืก. ืื ืจืขืงืืจืกืืึธื ืึธื ืืืืื ืืืขื ืืืื ืืืืืึธืืึทืืืฉ ืืืื ืืืื ื ืืืจื ืื ืืืคึผืืึทืืขื ืืืืฉืึทื ืคืื ืื Functor ืงืืึทืก ืคืื ืื ืืึธื ืึทื ืืืึธืก ืืืจ ืืึธืื ืืืืกืืขืจืืืืืื: ืืืจ ื ืึธืจ ืืึทืจืคึฟื ืฆื ืฉืืขืื ืึทืืข ืื ืืืขืจืืืงืึทืื ืคืื ืืขื ืืจื ืืื ืืขืจ ืจืขืืืืืึทื ืืืืืขืงืขืจื ืคึฟืื ืื ืจืขืงืืจืกืืืืข ืคืื ืงืฆืืข.
ืืืึทื ืขืจืฉืืขืจ ืืขืืึทื ืง ืืื ืืขืืืขื ืฆื ื ืืฆื ืื ืึธืืขืจ ืืึธื ืึทื, ืืืึธืก ืกืืื ืฆื ืื ืกืืจืืืขื ื ืคึผืื ืงื ืื ืืคืขืงืฅ ืืืึธืก ืืืจ ืืึทืจืคึฟื. ืืขืจ ืขืจืฉืืขืจ ืืืคึผืืึทืืขื ืืืืฉืึทื ืืื ืืขืฉืจืืื ืืื ืืขืืืขื ืืืืขืจ ื ืึธืขื ื ืฆื ืืขื ืึธืคึผืฆืืข. ืืื ืคืึทืงื, ืืื ืืขืืื ืคืื ืฃ ืคืึทืจืฉืืืขื ืข ืืืคึผืืึทืืึทื ืฅ ืืื ืืืื ืคืื ื ืืื ืืืืขื ืืฉืึทืืืึทืื ืืขืืขืฆื ืืืืฃ ืื ืื ืืขืจ ืืืื ืขืจ.
ืขืจืฉืืขืจ, ืืืจ ืืึทืจืคึฟื ืฆื ืืึทืืื ืึท ืึทืกืกืึธืกืืึทืืืืืข ืืขื ืืข ืคืื โโืืึทื ืืืืื ืืืขื ืืืคืืขืจืก - ืืึธืก ืืื ืขืคึผืขืก ืืืขืื ืฉืืึทื. ืฆืืืืืื ืก, ืืืจ ืืึทืจืคึฟื ืฆื ืงืขื ืขื ืืึทืืื ืืืขื ืึท ืงืึธื ืคืืืงื ืืื ืืืืขืงืืึทื. ืืึธืก ืงืขื ืืืื ืึธืืขืจ Monad ืคึฟืึทืจ ืึธืืขืจ, ืึธืืขืจ MonadPlus ืคึฟืึทืจ ืืคึฟืฉืจ. ืืขืจ ืืืืคึผื ืืืืืง ืืื ืึทื ืึธืืขืจ ืงืขื ืขื ืฆืืจืืงืงืืืขื ืึท ืืืขืจื ืืืื ืื ืืขืืฉืื ืืื ื ืืฉื ืกืืึทืคึผื, ืืื ืืคึฟืฉืจ ืงืขืจื ืืืืื ืืื ืคึฟืึธืจืืึทืฆืืข ืืืขืื ืืขื ืืื ืืขื ืคืึทื. ืืื ื ืืืจ ืืึธื ื ืื ืืึทืจืคึฟื ืึท ืืึทืืื ืืขืจ ืืืขืจื ืคึฟืึทืจ ืืฆืืื (ืขืก ืืื ืฉืืื ืกืืึธืจื ืืื ืฉืืึทื), ืืืจ ืงืืืึทืื ืืคึฟืฉืจ. ืืื ืืื ืืขื ืืึธืืขื ื ืืืขื ืืืจ ืืึทืจืคึฟื ืฆื ืคืึทืจืืื ืื ืื ืืืืจืงืื ื ืคืื ืฆืืืื ืืึธื ืึทืืก, ืืื ืงืืืขื ืืืืก
ืคืืจืืืืก ืืึธื ืืื ืงืืืึทืื ืึทืืึท ืึท ืงืึธืืคึผืืขืงืก ืืืคึผ? ืฆืืืื ืกืืืืช. ืขืจืฉืืขืจ, ืื ืืืคึผืืึทืืขื ืืืืฉืึทื ืืืจื ืก ืืืืก ืฆื ืืืื ืืืืขืจ ืขื ืืขื ืฆื ืืืคึผืขืจืึทืืืื. ืฆืืืืืื ืก, ืืืจ ืืึทืจืคึฟื ืฆื ืืึทื ืืคึผืืืืจื ืื ืฆืืจืืงืงืขืจ ืืืขืจื ืืื ืคืึทื ืคืื ืงืึธื ืคืืืงื ืืืขื ืืืจ ืฆืืจืืงืงืืืขื ืคืื ืจืขืงืืจืกืืึธื ืฆื ืืืงืขืจื ืื ืืึธืื ืข ืฉืืืืฃ, ืืืึธืก ืืื ืคืื ืืจืื ืืขืจ ืฆื ืืึธื ืืื ืื ืืคึฟืฉืจ ืืึธื ืึทื.
ืึทืืื ืืืจ ืืึทืงืืืขื ืืขื ืืืคึผืืึทืืขื ืืืืฉืึทื.
{-# LANGUAGE ExplicitForAll #-}
{-# LANGUAGE ScopedTypeVariables #-}
data Part = LeftPart | RightPart
otherPart :: Part -> Part
otherPart LeftPart = RightPart
otherPart RightPart = LeftPart
type PartMap a = Map.Map a Part
type OddCycle a = [a]
toEither :: Ord a => PartMap a -> a -> Either a a
toEither m v = case fromJust (v `Map.lookup` m) of
LeftPart -> Left v
RightPart -> Right v
type PartMonad a = MaybeT (State (PartMap a)) [a]
detectParts :: forall a. Ord a => Graph a -> Either (OddCycle a) (Bigraph a a)
detectParts g = case runState (runMaybeT dfs) Map.empty of
(Just c, _) -> Left $ oddCycle c
(Nothing, m) -> Right $ toBipartiteWith (toEither m) g
where
inVertex :: Part -> a -> PartMonad a
inVertex p v = ((:) v) <$> do modify $ Map.insert v p
let q = otherPart p
msum [ onEdge q u | u <- neigbours v g ]
{-# INLINE onEdge #-}
onEdge :: Part -> a -> PartMonad a
onEdge p v = do m <- get
case v `Map.lookup` m of
Nothing -> inVertex p v
Just q -> do guard (q /= p)
return [v]
processVertex :: a -> PartMonad a
processVertex v = do m <- get
guard (v `Map.notMember` m)
inVertex LeftPart v
dfs :: PartMonad a
dfs = msum [ processVertex v | v <- vertexList g ]
oddCycle :: [a] -> [a]
oddCycle c = tail (dropWhile ((/=) last c) c)
ืืขืจ ืืื ืืืึธืง ืืื ืื ืืึทืจืฅ ืคืื ืื ืึทืืืขืจืืืึทื. ืืื ืืืขื ืคึผืจืืืืจื ืฆื ืืขืจืงืืขืจื ืืืึธืก ืืื ืืขืฉืขืขื ืืฉ ืืื ืขืก.
- ืื ืืืขืจืืขืงืก ืืื ืืขืจ ืืืื ืคืื ืืขืจ ืขืจืฉืืขืจ ืืืฃ ืืืื ืืื ืืืจ ืืึทืืืื ืืขื ืืืขืจืืขืงืก ืคึฟืึทืจ ืื ืขืจืฉืืขืจ ืืึธื. ืืึธ ืืืจ ืืึทืฉืืืืขื ืึท ืืืืื ื ืืืขืจ ืฆื ืื ืืืขืจืืขืงืก ืืื ืืืืคื onEdge ืืืืฃ ืึทืืข ืฉืื ืื. ืืึธืก ืืื ืืืื ืืื ืืืจ ืืืงืขืจื ืื ืจืืคื ืึธื ืืืืื: ืืืื msum ืืืืืขืงืขืจื ืึท ืืืขืจื, ืืืจ ืฉืืืคึผื ืืืขืจืืขืงืก ืื ืืึธืจื.
- onEdge ืืื ืืขืจ ืืืื ืืื ืืืจ ืืึทืืืื ืืขื ืืจืขื. ืขืก ืืื ืืขืจืืคื ืฆืืืื ืืึธื ืคึฟืึทืจ ืืขืืขืจ ืืจืขื. ืืึธ ืืืจ ืงืึธื ืืจืึธืืืจื ืืืื ืื ืืืขืจืืขืงืก ืืืืฃ ืื ืื ืืขืจืข ืืืึทื ืืื ืืืืืื, ืืื ืืึทืืืื ืขืก ืืืื ื ืืฉื. ืืืื ืืืืืื, ืืืจ ืงืึธื ืืจืึธืืืจื ืฆื ืื ืืจืขื ืืื ืงืึทื ืคืืืงืืื ื. ืืืื ืืึธืก ืืื, ืืืจ ืฆืืจืืงืงืืืขื ืื ืืืขืจื - ืื ืฉืคึผืืฅ ืคืื ืื ืจืขืงืืจืกืืึธื ืึธื ืืืืื, ืืื ืึทืืข ืื ืืขืจืข ืืืขืจืืืกืขืก ืืืขื ืืืื ืืขืฉืืขืื ืืืืฃ ืฆืืจืืงืงืืืขื.
- ืคึผืจืึธืฆืขืกืืืขืจืืขืงืก ืืฉืขืงืก ืคึฟืึทืจ ืืขืืขืจ ืืืขืจืืขืงืก ืฆื ืขืก ืืื ืืืืืื ืืื ืืืืคื ืืื ืืืขืจืืขืงืก ืืืืฃ ืขืก ืืืื ื ืืฉื.
- dfs ืืืืคื ืคึผืจืึธืฆืขืกืืืขืจืืขืงืก ืืืืฃ ืึทืืข ืืืขืจืืืกืขืก.
ืึทื ืก ืึทืืข.
ืืขืฉืืืืข ืคืื โโืื ืืืึธืจื INLINE
ืื ืืืึธืจื INLINE ืืื ื ืืฉื ืืขืืืขื ืืื ืืขืจ ืขืจืฉืืขืจ ืืืคึผืืึทืืขื ืืืืฉืึทื ืคืื ืื ืึทืืืขืจืืืึทื; ืขืก ืืื ืืขืืืขื ืฉืคึผืขืืขืจ. ืืืขื ืืื ืืขืคืจืืืื ืฆื ืืขืคึฟืื ืขื ืึท ืืขืกืขืจ ืืืคึผืืึทืืขื ืืืืฉืึทื, ืืื ืืขืคึฟืื ืขื ืึทื ืื ื ืื-INLINE ืืืขืจืกืืข ืืื ื ืึธืืืืกืึทืืื ืกืืึธืืขืจ ืืืืฃ ืขืืืขืืข ืืจืึทืคืก. ืงืึทื ืกืืืขืจืื ื ืึทื ืกืขืืึทื ืืืงืึทืืื ืื ืคืึทื ืืงืฉืึทื ื ืืึธื ืึทืจืืขืื ืื ืืขืืืข, ืืึธืก ืืืืขืจ ืกืึทืคึผืจืืืื ืืืจ. ืืคืืื ืคืจืขืืืขืจ, ืืืืฃ ืื ืื ืืขืจ ืืึทืฉืื ืืื ืึท ืึทื ืืขืจืฉ ืืืขืจืกืืข ืคืื โโGHC ืขืก ืืื ืืขืืืขื ืงืืื ืืืืขืจืงื ืืืืืง.
ื ืึธื ืกืคึผืขื ืืื ื ืึท ืืืึธื ืืืืขื ืขื ืื GHC Core ืจืขืืืืืึทื, ืืื ืืื ืืขืืืขื ืืืืืืช ืฆื ืคืึทืจืจืืืื ืืขื ืคึผืจืึธืืืขื ืืื ืืืื ืฉืืจื ืคืื ืืงืกืคึผืืืกืึทื INLINE. ืืื ืขืืืขืืข ืคืื ื ืฆืืืืฉื GHC 8.4.4 ืืื GHC 8.6.5 ืื ืึธืคึผืืืืืืขืจ ืคืืจืฉืืืคื ืืื ืืขื ืืืืฃ ืืื.
ืืื ืืึธื ื ืื ืืขืจืืืึทืจื ืฆื ืืจืขืคื ืึทืืึท ืฉืืืฅ ืืื Haskell ืคึผืจืึธืืจืึทืืืื ื. ืึธืืขืจ, ืืคืืื ืืืึทื ื, ืึธืคึผืืืืืืขืจืก ืืื ืืึทืื ืืืกืืืืงืก, ืืื ืขืก ืืื ืืื ืืืขืจ ืึทืจืืขื ืฆื ืืขืื ืืื ืืื ืฅ. ืคึฟืึทืจ ืืืึทืฉืคึผืื, ืืึธ ืืืจ ืืืืกื ืึทื ืื ืคึฟืื ืงืฆืืข ืืึธื ืืืื ืื ืืืื ื ืืืืึทื ืขืก ืืื ืื ืืืื ื ืืื ืื ืืืคึผืขืจืึทืืืื ืืืขืจืกืืข, ืืื ืืึธืก ืืื ืึท ืกืืื ืฆื ืืขืื ืืขื ืงืึทืืคึผืืืืขืจ ืึท ืึธื ืฆืืืขืจืขื ืืฉ.
ืืืึธืก ืืื ืืขืฉืขื ืืืืึทืืขืจ?
ืืขืจื ืึธื ืืื ืืืคึผืืึทืืขื ืึทื ืื Hopcroft-Karp ืึทืืืขืจืืืึทื ืืื ืื ืืขืจืข ืืึธื ืึทืืก, ืืื ืืึธืก ืืื ืืขืืืขื ืืขืจ ืกืืฃ ืคืื ืื ืคึผืจืึธืืจืึทื.
ืืึทื ืง ืฆื Google Summer of Code, ืืื ืคืืจืืื ื ืคึผืจืึทืงืืืฉ ืืขืจืคืึทืจืื ื ืืื ืคืึทื ืืงืฉืึทื ืึทื ืคึผืจืึธืืจืึทืืืื ื, ืืืึธืก ื ืื ืืืืื ืืขืืึธืืคึฟื ืืืจ ืืึทืงืืืขื ืึทื ืื ืืขืจื ืฉืืคึผ ืืื Jane Street ืื ืคืืืืขื ืืข ืืืืขืจ (ืืื ืืื ื ืืฉื ืืืืขืจ ืืื ืืึทืืืืกื ืืขื ืึธืจื ืืื ืืคืืื ืฆืืืืฉื Habr ืก ื ืึทืืึทืืืฉืึทืืึทื ืืืืขื, ืึธืืขืจ ืขืก ืืื ืืืื ืขืจ. ืคืื ืื ืืืืื ืืง ืืื ืืืจ ืงืขื ืขื ืืืืขืจ ืฆื ืึธื ืืืื ื ืขืืขื ืืื ืคืึทื ืืงืฉืึทื ืึทื ืคึผืจืึธืืจืึทืืืื ื), ืึธืืขืจ ืืืื ืืึทืงืขื ืขื ืืืจ ืฆื ืื ืืืื ืืขืจืืขื ืืืขืื ืคืื ืึทืคึผืืืืื ื ืืขื ืคึผืึทืจืึทืืืื ืืื ืคืืจ, ืืืืืืืืง ืึทื ืืขืจืฉ ืคืื ืืืื ืืขืจืคืึทืจืื ื ืืื ืืจืืืืฆืืื ืขืื ืฉืคึผืจืึทืื.
ืืงืืจ: www.habr.com