癒しがほしい

猫並みにゆるく生きています

CODE FESTIVAL 2016 Final C - Interpretation

解法

ある人とある人の間に辺が貼ってあるか、ある人とある人が連結であることがわかればよい。ここで、UnionFindを使いたい気持ちになるので、どうにか使えないか考える。

ここでは、問題の入力例1を元に考えることにする。

f:id:donko110:20181206111118p:plain


この図を縦に見ると、ノードが同じ言語に並んでいる場合は、一つ目の条件である「2人ともが話すことの出来る言語が存在する」を満たしている。

また、1人目が3人目とコミュニケーションを取るためには、2人目を経由する必要があるが、これは図で表すと次のようになる。

f:id:donko110:20181206122240p:plain

赤色の矢印の両端の人はコミュニケーションができる。水色の矢印の両端はXが話せる言語である。
この時、AとBがXを経由してコミュニケーションを取ることができる時、AとBにパスが存在する。


水色の矢印については、同じ人がコミュニケーションを取ることができるとみなせるので、統合する必要はない(自己ループは考えない)。
赤色の矢印については、両端の人でコミュニケーションを取ることができるので、両端の人を統合し、一つのグループを作る。

あとは、N人の参加者が同じグループに入っているかを調べれば、全ての参加者とコミュニケーションを取ることができるかを調べられるので、この問題が解ける。

おわりに

UnionFindの練習にはちょうどいいかも。