久々にオンタイムで参加したのでメモ。
Div1 Easy(250): BiconnectedDiv1
グラフが2-edge-connectedであるとは、グラフ中のどの1辺を削除しても、任意の頂点の組の間にパスが存在することを言う。
n頂点のグラフGが2-edge-connectedを満たしたまま、辺をいくつか削除して、辺のコストの合計を最小にしたときの値を求めよ。
- 3 <= n <= 100
- 頂点G[i] と G[i+1] はコスト w1[i] でつながっている。
- 頂点G[i] と G[i+2] はコスト w2[i] でつながっている。
- 0 <= w1[i], w2[i] <= 10000
考えたこと
どの辺を削除してもパスが存在するので、1つの辺のみにつながる頂点が存在してはいけないことが分かる。 なので、頂点に2つ以上の辺が繋がった状態になるように辺を削っていけばよい。
結果
Challenge Succeeded
x– (0.00pts) 1222→1224
レーティング落ちなくてよかった。。。
あとで
本番は繋がった状態を何パターン化に分けて計算したが、考慮漏れあり、、、 あとでちゃんとDPしたコード:
class BiconnectedDiv1 { public: int minimize(vector <int> w1, vector <int> w2) { int n = w1.size() + 1; vi dp(n, 0); int total = 0; REP(i, n-1) { total += w1[i]; } REP(i, n-2) { total += w2[i]; } FOR(i, 2, n - 2) { dp[i] = dp[i - 1] + w1[i - 1]; if (i > 2) { dp[i] = max(dp[i], dp[i - 2] + w2[i - 2]); } } return total - dp[n-2]; } };