HDU4607(최대 지름 트리 DP)
한 번의 트리 DP를 통해 최대 지름을 구하고 최대 지름이 k개의 점을 포함할 수 있다면 최대 지름으로 가세요. 그렇지 않으면 점을 추가할 때마다 한 변을 두 번 더 걸어야 해요. 그러면 답은 어렵지 않아요.
#include <bits/stdc++.h>
using namespace std;
#define maxn 511111
#define maxm 1111111
int dp[maxn][2]; // i
struct node {
int to, next;
}edge[maxm];
int n, m, head[maxn], cnt;
int Max; //
void add_edge (int from, int to, int i) {
node &e = edge[i];
e.to = to, e.next = head[from], head[from] = i;
}
void dfs (int u, int father) {
for (int i = head[u]; i != -1; i = edge[i].next) {
int v = edge[i].to;
if (v == father)
continue;
dfs (v, u);
if (dp[v][0]+1 > dp[u][0]) {
dp[u][1] = dp[u][0];
dp[u][0] = dp[v][0]+1;
}
else if (dp[v][0]+1 > dp[u][1]) {
dp[u][1] = dp[v][0]+1;
}
}
Max = max (dp[u][1]+dp[u][0], Max);
}
int main () {
//freopen ("in", "r", stdin);
int t;
scanf ("%d", &t);
while (t--) {
scanf ("%d%d", &n, &m);
cnt = 0;
memset (head, -1, sizeof head);
for (int i = 1; i < n; i++) {
int u, v;
scanf ("%d%d", &u, &v);
add_edge (u, v, cnt++);
add_edge (v, u, cnt++);
}
Max = 0;
memset (dp, 0, sizeof dp);
dfs (1, 0);
int q;
while (m--) {
scanf ("%d", &q);
//cin >> q;
if (q <= Max+1) {
printf ("%d
", q-1);
}
else {
printf ("%d
", Max+2*(q-Max-1));
}
}
}
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.