dp 求调
  • 板块学术版
  • 楼主ZZQF5677
  • 当前回复2
  • 已保存回复2
  • 发布时间2023/8/6 08:42
  • 上次更新2023/11/3 05:38:40
查看原帖
dp 求调
482347
ZZQF5677楼主2023/8/6 08:42
#include <bits/stdc++.h>
using namespace std;
int n;
int d[1000005];
vector<int> e[1000005];
bool dfs_vis[1000005];
void dfs(int root, int high) {
  if (dfs_vis[root] == 1) {
    return;
  }
  dfs_vis[root] = 1;
  d[root] = high;
  for (int i = 0; i < e[root].size(); i++) {
    dfs(e[root][i], high + 1);
  }
  return;
}
int dp[1000005];
vector<int> q[1000005];
bool vis[1000005];
int main() {
  cin >> n;
  for (int i = 1; i <= n - 1; i++) {
    int u, v;
    cin >> u >> v;
    e[u].push_back(v);  // 建树时一定要注意有双边顺序!!!不然可能访问不到!!!
    e[v].push_back(u);
  }
  dfs(1, 1);
  int num = 0;
  for (int i = 1; i <= n; i++) {
    // cout << d[i] << " ";
    num += d[i];
  }
  // cout << "\n";
  if (num % 2 != 0) {
    cout << "-1\n";
    return 0;
  }
  for (int i = 1; i <= n; i++) {
    for (int j = num / 2; j >= d[i]; j--) {
      dp[j] = dp[j];
      if (dp[j - d[i]] + d[i] > dp[j]) {
        dp[j] = dp[j - d[i]] + d[i];
        q[j] = q[j - d[i]];
        q[j].push_back(i);
      }
    }
  }
  // cout << dp[num / 2] << "\n";
  if (dp[num / 2] != num / 2) {
    cout << "-1\n";
    return 0;
  }
  for (int i = 0; i < q[num / 2].size(); i++) {
    vis[q[num / 2][i]] = 1;
  }
  for (int i = 1; i <= n; i++) {
    cout << vis[i] << " ";
  }
  cout << "\n";
  return 0;
}

TLE

20pts https://www.luogu.com.cn/problem/P9498

2023/8/6 08:42
加载中...