贪心 40 pts,码风优良,悬关求调
查看原帖
贪心 40 pts,码风优良,悬关求调
537285
talentedbug楼主2024/11/7 11:16

思路简述:

  • 找到根节点,并 DFS 每个点的深度;
  • 按深度将所有点排序;
  • 从最深的点开始,检查周围距离 2 以内的节点是否已经设置消防局,若没有,将这个节点的祖父节点设为消防局。

这道题似乎没法下载数据,我这个蒟蒻造不出有效的 Hack,请各位大佬或指明错误,或给个 Hack,感谢!

#include <bits/stdc++.h>

using namespace std;
int n;
struct node {
	int id;
	int fa;
	vector<int> ch;
	int dep;
	bool hy;
} r[2200];
int id2r[2200];
int hcnt;

bool cmp_dep(node a, node b) {
	return a.dep > b.dep;
}

void dfs_dep(int p) {
	r[p].dep = r[r[p].fa].dep + 1;
	for (auto k: r[p].ch) {
		dfs_dep(k);
	}
}

int main() {
	cin >> n;
	int p;
	for (int i = 1; i <= n - 1; i++) {
		cin >> p;
		r[i + 1].fa = p;
		r[p].ch.push_back(i + 1);
	}
	int root = -1;
	for (int i = 1; i <= n; i++) {
		r[i].id = i;
		if (r[i].fa == 0) {
			root = i;
		}
	}
	r[root].fa = root;
	dfs_dep(root);
	sort(r + 1, r + n + 1, cmp_dep);
	for (int i = 1; i <= n; i++) {
		id2r[r[i].id] = i;
	}
	for (int i = 1; i <= n; i++) {
		if (
			!r[i].hy && 
			!r[id2r[r[i].fa]].hy && 
			!r[id2r[r[id2r[r[i].fa]].fa]].hy
		) {
			bool uc = false;
			for (auto k: r[id2r[r[i].fa]].ch) {
				if (id2r[k] != i) {
					if (r[id2r[k]].hy) {
						uc = true;
					}
				}
			}
			for (auto k: r[i].ch) {
				for (auto l: r[id2r[k]].ch) {
					if (r[id2r[l]].hy) {
						uc = true;
						break;
					}
				}
			}
			if (!uc) {
				hcnt++;
				r[id2r[r[id2r[r[i].fa]].fa]].hy = true;
			}
		}
	}
	cout << hcnt << endl;
	return 0;
}

2024/11/7 11:16
加载中...