Joeの精進記録

旧:競プロ練習記録

平面グラフ判定&描画アルゴリズム

元論文はhttp://hinkali.com/Education/PlanarityTesting.pdf

ここが日本語で説明してくれている http://www.th.cs.meiji.ac.jp/assets/researches/2007/toyota/index.html

アルゴリズム

  • グラフをdfsし、訪れた順にidを振っていく。dfs木と後退辺を覚えておく
  • 各辺の優先度を \min{u, v}とする。つまり両端のidのmin
  • 辺を優先度の大きい順に追加していく
  • そのときに2連結になるように、頂点を適宜増やしていく
  • 新たなループが生成されるとき、externally activeな頂点を外平面に向けるようにflipする(将来的に処理される辺はすべて外平面に来ているはず)
  • 最後まで追加できれば描画完了。無理なら平面グラフでない

f:id:xuzijian629:20191111195449p:plain

externally active

優先度 pの辺を処理している時点で、 wがexternally activeであるとは、 wがidが pの頂点が属する2連結成分の要素ではなく、かつ \mathrm{lowpoint}(w) \lt pであることをいう(後者が重要)。

f:id:xuzijian629:20191111194641p:plain

□が頂点vを処理段階でのexternally activeな頂点。

正当性

証明が複雑すぎて追いきれていないが、方針としては

  • もしグラフが平面グラフなのに、後退辺を追加できなかったとする
  • 後退辺を遮るexternally activeな頂点が存在する
  • それらの位置で場合分け
  • いずれも K_{3,3}をマイナーにもつので平面でない
  • 矛盾

みたいな方針