作业介绍

#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 5;
int n, a[N], f[N][2];
vector<int>e[N];

void dfs(int x, int fa) {
	f[x][0] = 0;
	f[x][1] = a[x];
	for (auto v : e[x]) {
		if (v == fa)
			continue;
		dfs(v, x);
		f[x][0] += max(f[v][1], f[v][0]);
		f[x][1] += f[v][0];
	}
}

int main() {
	cin >> n;
	for (int i = 1; i <= n; i++)
		cin >> a[i];
	for (int i = 1; i < n; i++) {
		int x, y;
		cin >> x >> y;
		e[x].push_back(y);
		e[y].push_back(x);
	}
	dfs(1, 0);
	cout << max(f[1][0], f[1][1]);
	return 0;
}
#include <bits/stdc++.h>
using namespace std;
const int N = 1e4 + 5;
int n, f[N][3];
vector<int>e[N];

/*
f[x][0]选x及x的爹的最小值
f[x][0] = 1+f[v][2]
f[x][1]选x及x的子树的最小值
f[x][1] = f[v][0]+f[t][1]
f[x][2]选x的子树的最小值
f[x][2] = f[v][1]
*/
void dfs(int x, int fa) {
	f[x][0] = 1;
	int sum = 0;
	for (auto v : e[x]) {
		if (v == fa)
			continue;
		dfs(v, x);
		f[x][0] += f[v][2];
		f[x][2] += f[v][1];
		sum += f[v][1];
	}
	f[x][1] = 1e9;
	for (auto v : e[x]) {
		if (v == fa)
			continue;
		f[x][1] = min(f[x][1], f[v][0] + sum - f[v][1]);
	}
	f[x][1] = min(f[x][0], f[x][1]);
	f[x][2] = min(f[x][1], f[x][2]);
}

int main() {
	cin >> n;
	for (int i = 1; i < n; i++) {
		int x, y;
		cin >> x >> y;
		e[x].push_back(y);
		e[y].push_back(x);
	}
	dfs(1, 0);
	cout << f[1][1] << endl;
	return 0;
}
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 5;
int n, f[N][5];
vector<int>e[N];

void dfs(int x, int fa) {
	f[x][0] = 1;
	int sum3 = 0;
	int sum4 = 0;
	int sum2 = 0;
	for (auto v : e[x]) {
		if (v == fa)
			continue;
		dfs(v, x);
		f[x][0] += f[v][4];
		f[x][3] += f[v][2];
		f[x][4] += f[v][3];
		sum2 += f[v][2];
		sum3 += f[v][3];
		sum4 += f[v][4];
	}
	f[x][1] = 1e9;
	f[x][2] = 1e9;
	for (auto v : e[x]) {
		if (v == fa)
			continue;
		f[x][1] = min(f[x][1], f[v][0] + sum3 - f[v][3]);
		f[x][2] = min(f[x][2], f[v][1] + sum2 - f[v][2]);
	}
	for (int i = 1; i <= 4; i++) {
		f[x][i] = min(f[x][i], f[x][i - 1]);
	}
}

int main() {
	cin >> n;
	for (int i = 2; i <= n; i++) {
		int x;
		cin >> x;
		e[i].push_back(x);
		e[x].push_back(i);
	}
	dfs(1, 0);
	cout << f[1][2] << endl;
	return 0;
}
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 2e5 + 5;
int n, f[N], dis[N], siz[N];
vector<int>e[N];

void dfs1(int x, int fa) {
	if (x != 1)
		dis[x] = dis[fa] + 1;
	siz[x] = 1;
	for (auto v : e[x]) {
		if (v == fa)
			continue;
		dfs1(v, x);
		siz[x] += siz[v];
	}
}

void dfs2(int x, int fa) {
	for (auto v : e[x]) {
		if (v == fa)
			continue;
		f[v] = f[x] + n - 2 * siz[v];
		dfs2(v, x);
	}
}

signed main() {
	cin >> n;
	for (int i = 1; i < n; i++) {
		int x, y;
		cin >> x >> y;
		e[x].push_back(y);
		e[y].push_back(x);
	}
	dfs1(1, 0);
	for (int i = 1; i <= n; i++)
		f[1] += dis[i];
	dfs2(1, 0);
	for (int i = 1; i <= n; i++) {
		cout << f[i] << ' ';
	}
	return 0;
}
#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 5;
int n, f[N], g[N];
int dis[N][2], son[N][2];
vector<int>e[N];

void dfs1(int x, int fa) {
	for (auto v : e[x]) {
		if (v == fa)
			continue;
		dfs1(v, x);
		if (dis[v][0] + 1 >= dis[x][0]) {
			dis[x][1] = dis[x][0];
			son[x][1] = son[x][0];
			dis[x][0] = dis[v][0] + 1;
			son[x][0] = v;
		} else if (dis[v][0] + 1 > dis[x][1]) {
			dis[x][1] = dis[v][0] + 1;
			son[x][1] = v;
		}
	}


}

void dfs2(int x, int fa) {
	f[x] = dis[x][0];
	if (son[fa][0] == x) {
		g[x] = max(1 + g[fa], dis[fa][1] + 1);
	} else {
		g[x] = max(1 + g[fa], dis[fa][0] + 1);
	}
	g[1] = 0;
	f[x] = max(f[x], g[x]);
	for (auto v : e[x]) {
		if (v == fa)
			continue;
		dfs2(v, x);
	}
}

int main() {
	cin >> n;
	for (int i = 1; i < n; i++) {
		int x, y;
		cin >> x >> y;
		e[x].push_back(y);
		e[y].push_back(x);
	}
	dfs1(1, 0);
	dfs2(1, 0);
	for (int i = 1; i <= n; i++) {
		cout << f[i] << " ";
	}
	return 0;
}
#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 5;
int n, m, siz[N], a[N], f[N], g[N], D[N]; //D[i]从i出发的最远距离
int dis[N][2], son[N][2];
vector<int>e[N];

void dfs1(int x, int fa) {
	siz[x] = a[x];
	for (auto v : e[x]) {
		if (v == fa)
			continue;
		dfs1(v, x);
		siz[x] += siz[v];
		if (siz[v]) {
			f[x] += f[v] + 2;
			if (dis[v][0] + 1 >= dis[x][0]) {
				dis[x][1] = dis[x][0];
				son[x][1] = son[x][0];
				dis[x][0] = dis[v][0] + 1;
				son[x][0] = v;
			} else if (dis[v][0] + 1 > dis[x][1]) {
				dis[x][1] = dis[v][0] + 1;
				son[x][1] = v;
			}
		}
	}
}

void dfs2(int x, int fa) {
	//什么情况下有g[x]
	if (m > siz[x]) {
		g[x] += g[fa] + f[fa] - f[x];
		if (siz[x] == 0)
			g[x] += 2;
		if (son[fa][0] == x) {
			D[x] = max(D[fa] + 1, dis[fa][1] + 1);
		} else
			D[x] = max(D[fa] + 1, dis[fa][0] + 1);
	}
	for (auto v : e[x]) {
		if (v == fa)
			continue;
		dfs2(v, x);
	}
}

int main() {
	cin >> n >> m;
	for (int i = 1; i < n; i++) {
		int x, y;
		cin >> x >> y;
		e[x].push_back(y);
		e[y].push_back(x);
	}
	for (int i = 1; i <= m; i++) {
		int x;
		cin >> x;
		a[x]++;
	}
	dfs1(1, 0);
	dfs2(1, 0);
	int id = 0, res = 1e9;
	for (int i = 1; i <= n; i++) {
		int tmp = f[i] + g[i] - max(dis[i][0], D[i]);
		if (tmp < res) {
			res = tmp;
			id = i;
		}
	}
	cout << id << endl;
	cout << res << endl;
	return 0;
}
状态
已结束
题目
14
开始时间
2026-10-1 0:00
截止时间
2026-10-9 23:59
可延期
24 小时