TopCoder Open 2R 250 - SnowPlow
問題
N ノードをつなぐ有向グラフが与えられる.2 ノード A, B について A→B と B→A のエッジ数は等しい.0 番ノードからそのグラフを辿った時に全エッジを渡る(ことができる)場合に渡るエッジの最小数はいくつ?
考え方
全エッジが一筆書きできれば最短なのは自明である.後は適当な経路でもって往復すれば(できることがわかれば)いいので,
- 0 と接続しているノードの 1 つとを往復する.
- 現在のルート中にあるノードから未踏エッジがあったらそのエッジを往復する.
- 2に戻る.
- ルートから派生する未踏エッジが無くなったら終了.それでも未踏エッジが残っていれば-1.
2の詳細だが,-A-B-C- という接続について →A→B→C→…→C→B→A→ の時に B-D があるとすると,→A→B→D→B→C→…→C→B→A→ にするわけである.
コード
#include <vector> #include <string> using namespace std; class SnowPlow { int n; int rec(vector<string>& r, int s) { int ret = 0; for( int d = 0 ; d < n ; ++d ) { if( r[s][d] > '0' ) { --r[s][d]; ret += rec(r, d) + 1; } } return ret; } int allSum(vector<string>& r) { int ret = 0; for( int i = 0 ; i < n ; ++i ) for( int j = 0 ; j < n ; ++j ) ret += r[i][j] - '0'; return ret; } public: int solve(vector<string> roads) { n = roads.size(); int sum = allSum(roads); if( rec(roads, 0) == sum ) return sum; return -1; } };