結果
| 問題 |
No.1976 Cut then Connect
|
| コンテスト | |
| ユーザー |
magsta
|
| 提出日時 | 2022-03-24 19:10:25 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
WA
(最新)
AC
(最初)
|
| 実行時間 | - |
| コード長 | 2,105 bytes |
| コンパイル時間 | 2,574 ms |
| コンパイル使用メモリ | 174,048 KB |
| 実行使用メモリ | 16,544 KB |
| 最終ジャッジ日時 | 2024-09-20 22:35:51 |
| 合計ジャッジ時間 | 5,369 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | WA * 2 |
| other | TLE * 1 -- * 30 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
struct Edge {
int u;
int v;
int cost;
Edge(int a, int b, int c) : u(a), v(b), cost(c) {
}
};
using Graph = vector<vector<Edge>>;
vector<int> dp;
int max_, max_2;
void dfs(const Graph& G, int v, int p, int x, bool flag) {
if (x == v) flag = false;
for (auto nv : G[v]) {
if (nv.v == p) continue;
dfs(G, nv.v, v, x, flag);
}
if (flag) {
int max1 = 0, max2 = 0;
for (auto c : G[v]) {
if (c.v == p) continue;
if (max1 < dp[c.v]) {
max2 = max1;
max1 = dp[c.v];
}
else if (max2 < dp[c.v]) {
max2 = dp[c.v];
}
}
max_ = max(max_, max1 + max2 + 1);
dp[v] = max1 + 1;
}
else {
int max1 = 0, max2 = 0;
for (auto c : G[v]) {
if (c.v == p) continue;
if (max1 < dp[c.v]) {
max2 = max1;
max1 = dp[c.v];
}
else if (max2 < dp[c.v]) {
max2 = dp[c.v];
}
}
max_2 = max(max_2, max1 + max2 + 1);
dp[v] = max1 + 1;
}
if (x == v) dp[v] = 0;
}
void dfs2(const Graph& G, int v, int p) {
for (auto nv : G[v]) {
if (nv.v == p) continue;
dfs2(G, nv.v, v);
}
;
for (auto c : G[v]) {
if (c.v == p) continue;
dp[v] = max(dp[v], dp[c.v] + 1);
}
}
int main() {
int N; cin >> N;
Graph G(N);
for (int i = 0; i < N - 1; i++) {
int a, b;
cin >> a >> b;
G[a - 1].emplace_back(a - 1, b - 1, 1);
G[b - 1].emplace_back(b - 1, a - 1, 1);
}
bool flag = true;
for (int i = 0; i < N; i++) {
if (G[i].size() >= 3) flag = false;
}
if (flag) {
cout << N << endl;
return 0;
}
int ans = 0;
for (int i = 0; i < N; i++) {
dp.assign(N, 0);
max_ = 0;
max_2 = 0;
dfs(G, 0, -1, i, true);
ans = max(ans, max_ + max_2);
}
cout << ans << endl;
}
magsta