目录
1811 求二叉树最小值_二叉树求最小值_a little funny的博客-CSDN博客
1809 三色二叉树 (7条消息) 洛谷P2585&ZJOI 2006-三色二叉树(树的染色-树形DP)_lonely_wind_的博客-CSDN博客
1802 (7条消息) 动态规划求树的最大连通分支问题_. 输入含有 n 个顶点的加权二叉树 t 和正数 τ,树 t 上每条边的权值都非负,树中顶_hnu哈哈的博客-CSDN博客
1821 判断完全二叉树(顺序存储)_牛客博客 (nowcoder.net)
1801 B - 树与二叉树_b树和二叉树_米诺minoz的博客-CSDN博客
1820 C 加分二叉树 - DWVictor - 博客园 (cnblogs.com)
1811 求二叉树最小值_二叉树求最小值_a little funny的博客-CSDN博客
C++版本的(DFS)
#include <iostream>
#include <cstring>
#include <stdio.h>
using namespace std;
#define MAXN 100100
#define Min(a,b) ((a)<(b)?(a):(b))
struct Graph {
int vex, next;
} G[MAXN << 1]; //边存了两遍。
int first[MAXN], mn, md;
bool flag[MAXN];
void DFS(int pos, int dep) {
int tot; flag[pos] = true;
if (dep >= md) {
if (dep > md) {md = dep; mn = pos;}
else if (pos < mn) mn = pos;}
for (tot = first[pos]; tot != -1; tot = G[tot].next)
if (!flag[G[tot].vex]) DFS(G[tot].vex, dep + 1);}
int main() {
int n, i, tot, s, e, a;
while (scanf("%d", &n) != EOF) {
memset(first, -1, sizeof(first));
tot = 0;
for (i = 1; i < n; i++) {
scanf("%d %d", &s, &e);
G[tot].vex = e;
G[tot].next = first[s];
first[s] = tot++;
G[tot].vex = s;
G[tot].next = first[e];
first[e] = tot++;
}
memset(flag, false, sizeof(flag));
mn = md = -1;
DFS(1, 0);
a = mn;
memset(flag, false, sizeof(flag));
mn = md = -1;
DFS(a, 0);
printf("%d %d\n", Min(a,mn), md + 1);
}}
1809 三色二叉树 (7条消息) 洛谷P2585&ZJOI 2006-三色二叉树(树的染色-树形DP)_lonely_wind_的博客-CSDN博客
#include <bits/stdc++.h>
using namespace std;
#define debug printf("#@$@%\n")
const int mac=5e5+10;
char s[mac];
vector<int>g[mac];
int cnt=0,dp[mac][3];
int dp2[mac][3];
int dfs_wedge(char *s,int fa)
{
if (!s[0]) return 0;
int nb=1;
cnt++;
if (fa!=-1){
g[cnt].push_back(fa);
g[fa].push_back(cnt);
}
if (s[0]=='0') return nb;
int u=cnt;
nb+=dfs_wedge(s+1,u);
if (s[0]=='2') nb+=dfs_wedge(s+nb,u);
return nb;
}
void dfs(int u,int fa)
{
int v1=0,v2=0;
for (int i=0; i<g[u].size(); i++){
int v=g[u][i];
if (v==fa) continue;
dfs(v,u);
dp[u][1]+=dp[v][0];
dp2[u][1]+=dp2[v][0];
if (v1) v2=v;
else