QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#65052 | #4599. Orgrimmar | zzxzzx123 | AC ✓ | 1090ms | 68004kb | C++ | 1.2kb | 2022-11-26 20:05:50 | 2022-11-26 20:05:53 |
Judging History
answer
#include<bits/stdc++.h>
using namespace std;
const int N=5e5+40,M=N<<1;
int h[N],e[M],ne[M],idx;
void add(int u,int v){
e[idx]=v,ne[idx]=h[u],h[u]=idx++;
}
int dp[N][2][2];
void dfs(int u,int fa){
dp[u][0][1]=1;
dp[u][1][1]=1;
for(int i=h[u];~i;i=ne[i]){
int v=e[i];
if(v==fa) continue;
dfs(v,u);
//最多的话只能选一条边
dp[u][0][0]+=max(dp[v][0][0],dp[v][1][0]);
dp[u][0][1]+=max(dp[v][0][0],dp[v][1][0]);
dp[u][1][0]+=max(max(dp[v][0][1],dp[v][1][1]),max(dp[v][0][0],dp[v][1][0]));
}
dp[u][1][1] = dp[u][0][1];
for (int i = h[u]; ~i; i = ne[i]) {
int v = e[i];
if (v == fa) continue;
dp[u][1][1] = max(dp[u][1][1], dp[u][0][1] - max(dp[v][0][0], dp[v][1][0]) + dp[v][0][1]);
}
}
int main () {
int t;
scanf("%d",&t);
while(t--){
memset(h,-1,sizeof h);
memset(dp,0,sizeof dp);
idx=0;
int n;
scanf("%d",&n);
for(int i=1;i<n;i++){
int u,v;
scanf("%d%d",&u,&v);
add(u,v),add(v,u);
}
dfs(1,0);
int ans=0;
for(int k=1;k<=n;k++){
for(int i=0;i<2;i++){
for(int j=0;j<2;j++){
ans=max(ans,dp[k][i][j]);
}
}
}
printf("%d\n",ans);
}
return 0;
}
详细
Test #1:
score: 100
Accepted
time: 1090ms
memory: 68004kb
input:
10 500000 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10 11 11 12 12 13 13 14 14 15 15 16 16 17 17 18 18 19 19 20 20 21 21 22 22 23 23 24 24 25 25 26 26 27 27 28 28 29 29 30 30 31 31 32 32 33 33 34 34 35 35 36 36 37 37 38 38 39 39 40 40 41 41 42 42 43 43 44 44 45 45 46 46 47 47 48 48 49 49 50 50 51 51 52 5...
output:
333334 499999 374859 374664 374655 374764 374530 374548 374848 374511
result:
ok 10 lines