結果
| 問題 |
No.1976 Cut then Connect
|
| コンテスト | |
| ユーザー |
magsta
|
| 提出日時 | 2022-05-27 12:18:04 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 2,997 bytes |
| コンパイル時間 | 2,155 ms |
| コンパイル使用メモリ | 180,216 KB |
| 実行使用メモリ | 27,392 KB |
| 最終ジャッジ日時 | 2024-09-20 22:42:12 |
| 合計ジャッジ時間 | 4,980 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 1 WA * 1 |
| other | AC * 5 WA * 26 |
ソースコード
#include <bits/stdc++.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() {
int N; cin >> N;
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++) {
cin >> a[i] >> b[i];
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);
}
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_ = 0;
for (int i = 0; i < N - 1; i++) {
ans_ = max(ans_, max(dp_[a[i] - 1][c[i]], dp_[b[i] - 1][d[i]]));
}
cout << ans_ << endl;
}
magsta