結果
問題 | No.1976 Cut then Connect |
ユーザー |
![]() |
提出日時 | 2022-06-08 19:58:47 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 123 ms / 2,000 ms |
コード長 | 3,371 bytes |
コンパイル時間 | 7,100 ms |
コンパイル使用メモリ | 306,836 KB |
実行使用メモリ | 31,832 KB |
最終ジャッジ日時 | 2024-11-24 12:13:55 |
合計ジャッジ時間 | 9,605 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | AC * 31 |
ソースコード
#include <bits/stdc++.h>#include "testlib.h"using namespace std;struct Edge {int u;int v;Edge(int a, int b) : u(a), v(b) {}};using Graph = vector<vector<Edge>>;vector<vector<int>> dp, dp2, dp_;void dfs(const Graph& G, int v, int p) {for (auto nv : G[v]) {if (nv.v == p) continue;dfs(G, nv.v, v);}int count_ = -1;for (auto c : G[v]) {count_++;if (c.v == p) continue;int count = -1;for (auto d : G[c.v]) {count++;if (d.v == v) continue;//cout << v << " " << c.v << " " << d.v << " " << count << " " << count_ << endl;if (dp[v][count_] < dp[c.v][count] + 1) {dp2[v][count_] = dp[v][count_];dp[v][count_] = dp[c.v][count] + 1;}else if (dp2[v][count_] < dp[c.v][count] + 1) {dp2[v][count_] = dp[c.v][count] + 1;}}count = -1;dp_[v][count_] = dp[v][count_] + dp2[v][count_];for (auto d : G[c.v]) {count++;if (d.v == v) continue;dp_[v][count_] = max(dp_[v][count_], dp_[c.v][count]);}}}void dfs2(const Graph& G, int v, int p) {int count_ = -1;for (auto c : G[v]) {count_++;if (c.v == p) {int count = -1;for (auto d : G[c.v]) {count++;if (d.v == v) continue;if (dp[v][count_] < dp[c.v][count] + 1) {dp2[v][count_] = dp[v][count_];dp[v][count_] = dp[c.v][count] + 1;}else if (dp2[v][count_] < dp[c.v][count] + 1) {dp2[v][count_] = dp[c.v][count] + 1;}}count = -1;dp_[v][count_] = dp[v][count_] + dp2[v][count_];for (auto d : G[c.v]) {count++;if (d.v == v) continue;dp_[v][count_] = max(dp_[v][count_], dp_[c.v][count]);}}}for (auto nv : G[v]) {if (nv.v == p) continue;dfs2(G, nv.v, v);}}int main() {registerValidation();int N = inf.readInt(2, 100000, "N");inf.readEoln();Graph G(N);vector<int> a(N - 1), b(N - 1), c(N - 1), d(N - 1);for (int i = 0; i < N - 1; i++) {a[i] = inf.readInt(1, N, "a");inf.readSpace();b[i] = inf.readInt(1, N, "a");inf.readEoln();c[i] = G[a[i] - 1].size();d[i] = G[b[i] - 1].size();G[a[i] - 1].emplace_back(a[i] - 1, b[i] - 1);G[b[i] - 1].emplace_back(b[i] - 1, a[i] - 1);}inf.readEof();for (int i = 0; i < N; i++) {if (G[i].size() == 0) cout << -1 << endl;}dp.assign(N, vector<int>(0));dp2.assign(N, vector<int>(0));dp_.assign(N, vector<int>(0));for (int i = 0; i < N; i++) {dp[i].assign(G[i].size(), 0);dp2[i].assign(G[i].size(), 0);dp_[i].assign(G[i].size(), 0);}dfs(G, 0, -1);dfs2(G, 0, -1);int ans_ = 1000000;for (int i = 0; i < N - 1; i++) {ans_ = min(ans_, max(max(dp_[a[i] - 1][c[i]], dp_[b[i] - 1][d[i]]), (dp_[a[i] - 1][c[i]] + 1) / 2 + (dp_[b[i] - 1][d[i]] + 1) / 2 + 1));}cout << ans_ << endl;}