QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#65052#4599. Orgrimmarzzxzzx123AC ✓1090ms68004kbC++1.2kb2022-11-26 20:05:502022-11-26 20:05:53

Judging History

你现在查看的是最新测评结果

  • [2023-08-10 23:21:45]
  • System Update: QOJ starts to keep a history of the judgings of all the submissions.
  • [2022-11-26 20:05:53]
  • 评测
  • 测评结果:AC
  • 用时:1090ms
  • 内存:68004kb
  • [2022-11-26 20:05:50]
  • 提交

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