萌新刚学 OI,求助 85pts 的树的直径水题
查看原帖
萌新刚学 OI,求助 85pts 的树的直径水题
298549
SIXIANG32楼主2021/3/24 22:17
#include <iostream>
#include <vector>
#include <cstring>
#define MAXN 100000
#define QWQ printf("qwq\n");
using namespace std;
int dis[MAXN + 10], fat[MAXN + 10], far, F, E, len, n, k;
int f[MAXN + 10], MaxN = 0;
bool vis[MAXN + 10];
vector <int> gra[MAXN + 10];
void dfs(int u, int fa) {
	int maxn = 0;
	for(int p = 0; p < gra[u].size(); p++) {
		int v = gra[u][p];
		if(v == fa) continue;
		dis[v] = dis[u] + 1;
		dfs(v, u);
	}
}
void calc() {
	memset(dis, 0, sizeof(dis));
	dfs(1, 0);
	int maxn = 0;
	len = 0;
	for(int p = 1; p <= n; p++)
		if(dis[p] > maxn)
			maxn = dis[p], F = p;
	dis[F] = 0;
	dfs(F, 0), maxn = 0;
	for(int p = 1; p <= n; p++)
		if(dis[p] > maxn)
			maxn = dis[p], E = p;
	len = maxn;
}
void get_fat(int u, int fa) {
	fat[u] = fa;
	for(int p = 0; p < gra[u].size(); p++) {
		int v = gra[u][p];
		if(v == fa) continue;
		get_fat(v, u);
	}
}
void get() {
	while(F != E) {
		vis[F] = vis[E] = 1;
		F = fat[F], E = fat[E];
	}
} 
void count(int u, int fa) {
	for(int p = 0; p < gra[u].size(); p++) {
		int v = gra[u][p];
		if(v == fa) continue;
		count(v, u);
		int DIS = 1;
		if(vis[u] + vis[v] == 2) DIS = -1;
		MaxN = max(MaxN, f[u] + f[v] + DIS);
		f[u] = max(f[u], f[v] + DIS);
	}
}
int main() {
	cin >> n >> k;
	for(int p = 1, x, y; p < n; p++) {
		cin >> x >> y;
		gra[x].push_back(y);
		gra[y].push_back(x);
	}
	calc();
	if(k == 1) {
		cout << (n - 1) * 2 - len + 1<< endl;
		return 0;
	}
	else {
		get_fat(1, 0);
		get();
		count(1, 0); 
		cout << (n - 1) * 2 - len - MaxN + 2 << endl;
	}
}

RT
鬼知道我怎么是 85pts,目测和标准答案差 1 就离谱/dk

2021/3/24 22:17
加载中...