DS W12

目录

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博客

1412 二叉树的繁茂度_Felven的博客-CSDN博客 

1820 C  加分二叉树 - DWVictor - 博客园 (cnblogs.com)

2123 B(广义表生成二叉树)的高度和宽度

1806 C 求二叉树中节点的深度 

1818 A HFM Basic

1818 F HFM coding


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 

猜你喜欢

转载自blog.csdn.net/qq_51314244/article/details/130555839
DS