結果
| 問題 |
No.2677 Minmax Independent Set
|
| コンテスト | |
| ユーザー |
ゼット
|
| 提出日時 | 2024-03-15 23:21:07 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 719 ms / 2,000 ms |
| コード長 | 2,970 bytes |
| コンパイル時間 | 1,552 ms |
| コンパイル使用メモリ | 107,168 KB |
| 最終ジャッジ日時 | 2025-02-20 06:05:18 |
|
ジャッジサーバーID (参考情報) |
judge1 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 61 |
ソースコード
#include <iostream>
#include <vector>
#include <deque>
#include <algorithm>
#include <map>
using namespace std;
int main() {
int N;
cin >> N;
vector<vector<int>> G(N);
for (int i = 0; i < N - 1; ++i) {
int a, b;
cin >> a >> b;
G[a - 1].push_back(b - 1);
G[b - 1].push_back(a - 1);
}
vector<vector<int>> dp1(N, vector<int>());
vector<vector<int>> dp2(N, vector<int>());
vector<vector<int>> c(N, vector<int>(2, 0));
vector<int> dist(N, -1);
dist[0] = 0;
deque<int> S;
S.push_back(0);
while (!S.empty()) {
int x = S.back();
S.pop_back();
for (int y : G[x]) {
if (dist[y] >= 0) continue;
dist[y] = dist[x] + 1;
S.push_back(y);
}
}
vector<pair<int, int>> L;
for (int i = 0; i < N; ++i) {
L.push_back(make_pair(dist[i], i));
}
sort(L.rbegin(), L.rend());
for (int i = 0; i < N; ++i) {
int x = L[i].second;
int k1 = 0, k2 = 1;
vector<int> u1(G[x].size(), 0), u2(G[x].size(), 0);
for (int j = 0; j < G[x].size(); ++j) {
int y = G[x][j];
if (dist[y] < dist[x]) continue;
u1[j] = c[y][0];
u2[j] = max(c[y][0], c[y][1]);
k1 += u2[j];
k2 += u1[j];
}
dp1[x] = u1;
dp2[x] = u2;
c[x][0] = k1;
c[x][1] = k2;
}
S.push_back(0);
vector<map<int, int>> T(N);
for (int i = 0; i < N; ++i) {
for (int j = 0; j < G[i].size(); ++j) {
T[i][G[i][j]] = j;
}
}
while (!S.empty()) {
int x = S.back();
S.pop_back();
vector<int> l1(G[x].size(), 0), r1(G[x].size(), 0), l2(G[x].size(), 0), r2(G[x].size(), 0);
for (int j = 0; j < G[x].size(); ++j) {
l1[j] = dp1[x][j];
l2[j] = dp2[x][j];
r1[j] = dp1[x][j];
r2[j] = dp2[x][j];
}
for (int j = 1; j < G[x].size(); ++j) {
l1[j] += l1[j - 1];
l2[j] += l2[j - 1];
}
for (int j = G[x].size() - 2; j >= 0; --j) {
r1[j] += r1[j + 1];
r2[j] += r2[j + 1];
}
for (int j = 0; j < G[x].size(); ++j) {
int y = G[x][j];
if (dist[y] < dist[x]) continue;
int w1 = 0, w2 = 1;
if (j > 0) {
w1 += l2[j - 1];
w2 += l1[j - 1];
}
if (j < G[x].size() - 1) {
w1 += r2[j + 1];
w2 += r1[j + 1];
}
int pos = T[y][x];
dp1[y][pos] = w1;
dp2[y][pos] = max(w2, w1);
S.push_back(y);
}
}
int result = 1e8;
for (int i = 0; i < N; ++i) {
int ans = 1;
for (int val : dp1[i]) {
ans += val;
}
result = min(result, ans);
}
cout << result << endl;
return 0;
}
ゼット