tokizo

競技プログラミングの備忘録や日記

square869120Contest #1-C お金の街 (The Money Town)

躓いたのでメモ

問題概要

問題リンク

各頂点にお金が割り振られた無向グラフが与えられる
始点は自由で、より多くのお金を獲得したい、ただし同じ頂点は1回しか通れない

考察・解法

各頂点からそれぞれDFSして最大値更新すればOK~~~と考えたが、入力例1で不可能と判断
入力例1は以下の様なグラフになる

f:id:fawula:20190420143026p:plain

隣接リストで辺を管理する場合、頂点1の次は頂点2に到達してしまい、頂点3には到達できず最大値を取れなくなってしまう
なので、ある頂点から再帰的にDFSを行うとき、新しく到達した頂点の訪問の有無を記録する配列をfalseにしてあげることで1つの頂点からの最大値を取りうる経路の探索が可能となる

説明下手くそすぎるので図にかいた
入力例1の場合を考える

・経路例1 f:id:fawula:20190420144148p:plain

・経路例2 f:id:fawula:20190420144151p:plain

辺自体にコストがあるわけではなく、頂点自体にコスト(しかも大きい方が良しとされる)ので単純なDFSをしてしまうとある頂点Aから別のある頂点までの経路は最短経路の更新がなされないため、1通りとなってしまい題意通りの答えを出力できない

なので、以下の様にする
f:id:fawula:20190420145022p:plain

コード

atcoder.jp