换根dp

根据牛客的每日一题,学习了换根dp(没整好dp的我直接整上了换根dp),还是很不错的,学习了不会的知识,其实最难的地方应该也就是转移那里


换根dp大体思路:

  • 用邻接表存储信息
  • 然后dfs随机选取一点作为根,然后找出他的贡献值
  • 另外dfs第一次搜索时,我们需要记录一些题目需要求出的信息(或者一些转换的信息)
  • 然后我们第二次dfs时候,求出相关的转移数据,这里应该会另外开一个数组来记录
  • 最终遍历这个数组,求出最大值或最小值


首先看下简单版本的第一题,只说解题思路

题目链接

解题思路:

  • 首先我们按照邻接表存储
  • 然后我们首先dfs一遍(以1为根节点),这一遍我们存储每个节点有多少子节点,然后存储以1为根的情况下,每个节点的深度
  • 然后我们开一个数组fa,存储当前节点1,题目中所要求的深度和。
  • 我们再dfs一遍,这次我们要实现换根,这里的贡献值,如果由 u 换到 v, 那么贡献值就由fa[v] = fa[u] - dist[v] + (n - dist[v]) , 这里dist记录的节点数目。
  • 最终我们求fa的最小值即可

这里借鉴雨巨的一个图,来更形象的表达一下换根的过程 相关链接

在这里插入图片描述

相关代码:

#include <iostream>
#include <cstring>
#include <cstdio>

using namespace std;

const int N = 1000010, M = 2000010;

int  dep[N], h[N], ne[M], e[M], dist[N], idx;
long long fa[N];
int n;

void add(int x, int y){
	e[idx] = y, ne[idx] = h[x], h[x] = idx++;
}

void dfs(int u, int f){

	dist[u] = 1;

	dep[u] = dep[f] + 1;
	
	for (int i = h[u]; i != -1; i = ne[i]){
		int j = e[i];
		if (j != f){
			dfs(j,u);
			dist[u] += dist[j]; 
		}
	}
}

void dfs2(int u, int f){

	for (int i = h[u]; i != -1 ; i = ne[i]){
		int j = e[i];
		if (j != f){
			fa[j] = fa[u] + n - (long long) 2 * dist[j];
			dfs2(j,u);
		}
	}
}

int main(){
	
	scanf("%d",&n);
	memset(h,-1,sizeof h);
	memset(dep,-1,sizeof dep);
	int x, y;
	for (int i = 0; i < n - 1; i++){
		scanf("%d%d",&x,&y);
		add(x,y), add(y,x);
	}

	dfs(1,0);

	for (int i = 1; i <= n; i++){
		fa[1] += dep[i];
	}

	dfs2(1,0);
	
	long long mx = 1e9;

	for (int i = 1; i <= n; i++){
		mx = min(mx,fa[i]);
	}
	printf("%lld\n",mx);
	return 0;
}




第二题题目链接

这题和上面的题类似,就是题意不太好懂,转移的方法也不太好懂,自己写写可能就明白了


解题思路:

  • 首先和之前的一样,这里多了一个边权,所以所开一个数组w记录边权
  • 然后我们第一次遍历记录的是当前根节点(1),到根节点的最大流量,还有其他节点的流量(其他节点的流量都是从他们的子节点到当前节点的,不与父节点互通)
  • 然后我们开一个数组f记录当前根节点的流量,然后我们开始第二次dfs,我们换根也就是转换他的流量,我们的流量都是从子节点流向根节点,所以当出现v ,u时, u为根节点,那么他需要改变的为 u -> v ,这里的u首先要改变一下,他首先取值为 f[v] = main(w, f[u] - min(flow[u][v], w), 边的流量和边改变由f[u]点流量的改变,这两种情况,最后取最大值即可。

在这里插入图片描述

相关代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;

const int N = 200010, M = 400010;

int h[N], ne[M], e[M], w[M], d[M], f[M], deg[N], idx;

void add(int x, int y, int z){
    e[idx] = y, ne[idx] = h[x], w[idx] = z, h[x] = idx++;
}

void dfs1(int u, int fa){
    for (int i = h[u]; i != -1; i = ne[i]){
        int j = e[i];
        int ww = w[i];
        if (j == fa) continue;
        dfs1(j, u);
        if (deg[j] == 1) d[u] += ww;
        else d[u] += min(ww, d[j]);
    }
}

void dfs2(int u, int fa){
    for (int i = h[u]; i != -1; i = ne[i]){
        int j = e[i];
        int ww = w[i];
        if (j == fa) continue ;
        f[j] = d[j] +  min(ww,f[u] - min(ww,d[j]));
        dfs2(j, u);
    }
}

int main(){
    int T;
    scanf("%d",&T);
    while(T--){
        int n;
        scanf("%d",&n);
        memset(d, 0, sizeof d);
        memset(f, 0, sizeof f);
        memset(h, -1, sizeof h);
        memset(deg, 0, sizeof h);
        
        idx = 0;

        for (int i = 0; i < n - 1; i++){
            int x, y, z;
            scanf("%d%d%d",&x,&y,&z);
            add(x, y, z), add(y, x, z);
            deg[x] ++;
            deg[y] ++;
        }

        int x = 1;

        dfs1(x,0);

        f[x] = d[x];

        dfs2(x, 0);

        int res = 0;
        for (int i = 1; i <= n; i ++){
            res = max(res, f[i]);
        }
        printf("%d\n",res);
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: PS176 DP-to-HDMI Dongle Reference是一种将DisplayPort信号转为HDMI信号的接口产品。DisplayPort和HDMI都是一种用于音视频传输的数字接口标准。DP-to-HDMI Dongle可以将使用DisplayPort接口的设备(如电脑、笔记本电脑、手机等)连接到使用HDMI接口的显示设备(如电视、投影仪等)上进行视频和音频输出。 PS176 DP-to-HDMI Dongle Reference采用了PS176芯片作为控制芯片,这是一款由Cypress(赛普拉斯)公司生产的高性能芯片,用于实现DisplayPort和HDMI之间的转。该芯片具有稳定的转效果和优质的信号传输能力,可以确保高清视频和高质量音频的传输。同时,该芯片还支持高达4K分辨率的视频输出,可以满足用户对高清画面的需求。 使用PS176 DP-to-HDMI Dongle Reference时,只需将DisplayPort接口插入设备的DisplayPort输出端口,然后将HDMI接口插入显示设备的HDMI输入端口,接口插拔简单方便。插上后,显示设备即可通过HDMI接口接收到DisplayPort信号,并将其转为对应的视频和音频信号进行输出,实现设备之间的连接与传输。 总结而言,PS176 DP-to-HDMI Dongle Reference是一款使用PS176芯片的DisplayPort转HDMI的转接头产品,适用于将使用DisplayPort接口的设备连接到使用HDMI接口的显示设备上进行视频和音频输出。它具有可靠的转效果、优质的信号传输能力和高分辨率的视频输出,能够满足用户对高清画面的需求。 ### 回答2: PS176 DP到HDMI转接器参考是一种数字信号转设备,用于将DisplayPort(DP)视频信号转为HDMI(High-Definition Multimedia Interface)信号。它可以连接支持DP输出的计算机或其他设备与使用HDMI输入的显示器、电视或投影仪等设备进行连接。 这款转接器采用了PS176芯片作为参考设计。PS176芯片是一种高性能的数字视频处理器,具有可靠稳定的信号转能力。它能够将DP的信号转为HDMI的信号,并且支持高分辨率的视频输出。使用这个转接器,用户可以将高品质的DP视频信号传输到HDMI设备上,实现高清晰度的视频显示。 该转接器参考设计还可能包括其他组件,例如电路板、接口、插头等,以提供完整的功能和兼容性。它可能支持高带宽的视频传输,包括4K、60Hz的高分辨率视频输出。除了视频信号的转,这个转接器也可以传输音频信号,使用户能够享受到高质量的音频效果。 对于使用PS176 DP到HDMI转接器参考设计的用户来说,他们只需要将转接器的DisplayPort接口连接到DP输出设备上,再将HDMI接口连接到HDMI输入设备上,就可以实现信号转和视频传输。这款转接器设计简单易用,适用于不同场合的应用,例如办公室、家庭娱乐、教育等。 总之,PS176 DP到HDMI转接器参考是一款高性能的数字信号转设备,基于PS176芯片设计,可以将DisplayPort信号转为HDMI信号,实现高清晰度的视频和音频传输,满足用户的不同需求。 ### 回答3: PS176 DP到HDMI转接头是一种用于连接DisplayPort(DP)接口和HDMI接口的转接头参考设计。DisplayPort和HDMI是两种常见的视频传输接口,DisplayPort主要用于连接电脑和显示器,而HDMI则广泛应用于电视、投影仪和一些消费电子设备。 PS176是一个高性能的转接头控制器,具有很多先进的特性。它支持DisplayPort 1.4a版本和HDMI 2.0b版本的规范,可以实现高清的视频传输和音频输出。该参考设计还支持高达4K分辨率的视频传输,保证了图像的清晰度和细节,同时还能够传输高品质的音频。 此外,PS176还具备一些其他特点,比如支持多种色彩空间和色深的传输,能够处理高帧率视频和3D视频,并支持多显示器环境。它还采用了先进的视频处理技术,如动态范围扩展、色彩空间转和降噪等,进一步提升了图像质量。 对于用户而言,使用PS176 DP到HDMI转接头可以方便地将DP接口的设备连接到HDMI接口的显示设备上,如连接笔记本电脑到电视或投影仪。这使得用户可以享受更大的屏幕空间和更高的分辨率,同时还能够通过一根线缆传输音频信号,消除了多余的接线和插拔。 总的来说,PS176 DP到HDMI转接头参考设计是一种可靠、高性能的解决方案,能够有效地连接DP和HDMI接口设备,提供高清的视频和音频传输。它为用户带来了更好的使用体验,扩展了设备的连接能力,适用于各种需求的场合。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值