图论(1):多叉树

多叉树

  • 一、基础知识
    • 1. 图 & 树
    • 2. 模板
      • 2.1 建图
  • 二、简单循环
    • 1. 【模板】树的路径求和
    • 2. 道路修建(改)
    • 3. 联合权值
    • 4. 毛毛虫树
  • 三、自顶向下/自底向上
    • 1. 医疗中心
    • 2. 【模板】树的直径
    • 3. 【模板】最大子树和
    • 4. 信号放大器

一、基础知识

1. 图 & 树

图:网格结构
树:层次结构
树是一种特殊的图
(把多叉树当作图看待)

树:只要下述条件满足两个即可推导出是一棵树

  1. nnn 个顶点、n−1n-1n1 条边
  2. 连通图
  3. 无环图

树的任意两点有且仅有一条路径。

2. 模板

2.1 建图

#include<bits/stdc++.h>
using namespace std;
const int MAXN=1e5+8;
int n,sz[MAXN];
long long ans=0;
struct Edge{int v,w;//v:边的终点//w:边的权值
};
vector<Edge>adj[MAXN];
void dfs(int u,int f){//f:father 防止取出的子结点和父结点重复导致地循环}
int main(){cin>>n;for(int i=1,u,v,w;i<n;i++)cin>>u>>v>>w,adj[u].push_back({v,w}),adj[v].push_back({u,w});dfs(1,0);cout<<ans;return 0;
}

sz[u]:表示以结点 uuu 为根的子树的结点总数
叶结点:sz[u]=1
非叶结点:sz[u]=1+sum(sz[v])(其中 vvvuuu 的子结点)

二、简单循环

1. 【模板】树的路径求和

在这个问题中,给定一个值 sss 和一棵树。在树的每个节点有一个权值,第 iii 个点的权值为 aia_iai,问有多少条路径的节点权值总和为 sss。路径中节点的深度必须是升序的。假设节点 111 是根节点,根的深度是 000,它的儿子节点的深度为 111。路径不必一定从根节点开始。


遇到路径题,优先考虑建树。树的结点原则:一个爸爸可以有很多孩子,但每个孩子只有一个爸爸。根据这个原则,我们可以从叶结点开始遍历,减少时间复杂度。

#include<bits/stdc++.h>
using namespace std;
const int MAXN=1e5+8;
int n,s,val[MAXN],pa[MAXN];
//parent[a]: 编号为a的结点的父结点的编号
int main(){cin>>n>>s;for(int i=1;i<=n;i++)cin>>val[i];for(int i=1,u,v;i<n;i++)cin>>u>>v,pa[v]=u;long long ans=0;//自下而上搜索,时间更少for(int u=1;u<=n;u++){int sum=0,v=u;while(v!=0&&sum<s)sum+=val[v],v=pa[v];if(sum==s)ans++;}cout<<ans;return 0;
}

2. 道路修建(改)

在 W 星球上有 nnn 个国家。为了各自国家的经济发展,他们决定在各个国家之间建设双向道路使得国家之间连通。但是每个国家的国王都很吝啬,他们只愿意修建恰好 n−1n−1n1 条双向道路。
每条道路的修建都要付出一定的费用,这个费用等于道路长度乘以道路两端的国家个数之差的绝对值。由于国家的数量十分庞大,道路的建造方案有很多种,同时每种方案的修建费用难以用人工计算,国王们决定找人设计一个软件,对于给定的建造方案,计算出所需要的费用。请你帮助国王们设计一个这样的软件。


需要计算每个结点作为根的子树的大小时,优先考虑建图。根据标准建图模板,写出如下程序。

#include<bits/stdc++.h>
using namespace std;
const int MAXN=1e5+8;
int n,sz[MAXN];
long long ans=0;
struct Edge{int v,w;
};
vector<Edge>adj[MAXN];
//adj[a]={b,c}表示有一条从a到b的路径,其边权(长度)为c
void dfs(int u,int f){sz[u]=1;for(auto[v,w]:adj[u]){if(v==f)continue;//防止遍历的子结点是父结点陷入死循环(因为是无向图)dfs(v,u);sz[u]+=sz[v];ans+=1ll*w*abs(n-sz[v]-sz[v]);}
}
int main(){cin>>n;for(int i=1,u,v,w;i<n;i++)cin>>u>>v>>w,adj[u].push_back({v,w}),adj[v].push_back({u,w});dfs(1,0);cout<<ans;return 0;
}

3. 联合权值

无向连通图 G 有 nnn 个点,n−1n−1n1 条边。点从 111nnn 依次编号,编号为 iii 的点的权值为 WiW_iWi,每条边的长度均为 111。图上两点 (u,v)(u,v)(u,v) 的距离定义为 uuu 点到 vvv 点的最短距离。对于图 G 上的点对 (u,v)(u,v)(u,v),若它们的距离为 222,则它们之间会产生 Wv×WuW_v\times W_uWv×Wu 的联合权值。
请问图 G 上所有可产生联合权值的有序点对中,联合权值最大的是多少?所有联合权值之和是多少?


如果建树会有太复杂的父子关系,不妨直接建图。举例为 222 的两个结点要么是兄弟结点,要么是爷孙结点。所以我们可以直接粗暴地写出如下代码:

#include<bits/stdc++.h>
using namespace std;
const int MOD=10007;
const int MAXN=2e5+8;
int n,val[MAXN];
vector<int>adj[MAXN];
int main(){cin>>n;for(int i=1,u,v;i<n;i++)cin>>u>>v,adj[u].push_back(v),adj[v].push_back(u);for(int i=1;i<=n;i++)cin>>val[i];long long mx_wt=0,sum_wt=0;for(int u=1;u<=n;u++){//遍历第一个点ufor(int v1:adj[u])//遍历u的所有子结点和u的父结点for(int v2:adj[u])if(v1!=v2)//遍历所有与u互为兄弟结点或所有和u互为爷孙结点的结点mx_wt=max(mx_wt,1ll*val[v1]*val[v2]),(sum_wt+=1ll*val[v1]*val[v2])%=MOD;}cout<<mx_wt<<" "<<sum_wt;return 0;
}

但是这样时间复杂度实在太大,考虑进行优化。不妨这么想:假如有一个结点 uuu,它的子结点有 v1,v2,v3,v4,v5v_1,v_2,v_3,v_4,v_5v1,v2,v3,v4,v5。我们要求的是:
1.max{vi×vj}2.Σvi×vj1.\ \text{max}\{v_i\times v_j\} \\ 2.\ \Sigma v_i\times v_j1. max{vi×vj}2. Σvi×vj
前提条件:i≠ji\ne ji=j

解决 1.1.1. 的最优方法:找出 v1,v2,v3,v4,v5v_1,v_2,v_3,v_4,v_5v1,v2,v3,v4,v5 中的最大值和次大值,相乘即可;
解决 2.2.2. 的最优方法:画出下图。

/v1v_1v1v2v_2v2v3v_3v3v4v_4v4v5v_5v5
v1v_1v1要求要求要求要求
v2v_2v2要求要求要求要求
v3v_3v3要求要求要求要求
v4v_4v4要求要求要求要求
v5v_5v5要求要求要求要求

然后把所有“要求”的值进行求和。不妨用容斥原理:
(v1+v2+v3+v4+v5)2−(v12+v22+v32+v42+v52)(v_1+v_2+v_3+v_4+v_5)^2-(v_1^2+v_2^2+v_3^2+v_4^2+v_5^2)(v1+v2+v3+v4+v5)2(v12+v22+v32+v42+v52)

于是有了如下程序:

#include<bits/stdc++.h>
using namespace std;
const int MOD=10007;
const int MAXN=2e5+8;
int n,s,val[MAXN];
vector<int>adj[MAXN];
int main(){cin>>n;for(int i=1,u,v;i<n;i++)cin>>u>>v,adj[u].push_back(v),adj[v].push_back(u);for(int i=1;i<=n;i++)cin>>val[i];long long mx_wt=0,sum_wt=0;for(int u=1;u<=n;u++){long long mx_val=0,sub_val=0,sum_val=0,sum_val2=0;for(int v:adj[u]){if(val[v]>=mx_val)sub_val=mx_val,mx_val=val[v];else if(val[v]>=sub_val)sub_val=val[v];sum_val+=val[v];sum_val2+=1ll*val[v]*val[v];}mx_wt=max(mx_wt,mx_val*sub_val);sum_wt=(sum_wt+sum_val*sum_val-sum_val2)%MOD;}cout<<mx_wt<<" "<<sum_wt;return 0;
}

mx_val:最大权值
sub_wal:次大权值
sum_val:权值的和
sum_val2:权值的平方的和

4. 毛毛虫树

毛毛虫通常由身体和细小的足组成,所有的足都和毛毛虫的身体直接相连。
如果一个无向图满足以下性质,我们称这个图叫做毛毛虫图(Caterpillar):
1、图中没有环,并且图上所有节点都相互连通。
2、在图中能找到一条路径,使得所有节点不是在路径上,就是与路径上的节点有直接连边。

根据上述内容,我们可以写出一个判断程序:

  1. 检查这个图是不是一棵树(满足 nnn 个结点 n−1n-1n1 条边)
  2. 检查每个点是否最多只连接了两个身体结点(即身体不能分叉,如下)
A
B
C
  1. 遍历一遍所有结点,检查所有结点是否相互连通(每个结点是否都被遍历到了)
#include<bits/stdc++.h>
using namespace std;
const int MAXN=1e5+8;
int n,m;
vector<int>adj[MAXN];
bool is_ctp,vis[MAXN];
void dfs(int u){int cnt=0;//统计身体结点个数for(int v:adj[u]){cnt+=(adj[v].size()>1);//父结点的计算也包含在内if(!vis[v])vis[v]=true,dfs(v);}//每个结点最多连接两个身体结点if(cnt>2)is_ctp=false;//连了超过两个身子,说明u是身体结点,相当于一个身体结点至少有三个子结点(而这个三个点又都是身体结点)
}
int main(){int T=0;while(cin>>n&&n){T++;memset(vis,false,sizeof(vis));for(int u=1;u<=n;u++)adj[u].clear();cin>>m;for(int i=1,u,v;i<=m;i++)cin>>u>>v,adj[u].push_back(v),adj[v].push_back(u);is_ctp=(n-m==1);if(!is_ctp)cout<<"Graph "<<T<<" is not a caterpillar.\n";vis[1]=true,dfs(1);for(int u=1;u<=n;u++)is_ctp&=vis[u];cout<<"Graph "<<T<<(is_ctp?" is":" is not")<<" a caterpillar.\n";}return 0;
}

三、自顶向下/自底向上

1. 医疗中心

在一个偏远的山区,政府需要在村庄之间选取建造一个医疗中心。山区的村庄由一张树结构的地图表示,其中每个村庄的居民数量(人口数)标注在圈内,而每个村庄的编号写在圈边上。村庄之间的道路恰好能连通所有村庄且长度固定为 111
为了方便居民就医,规划团队希望医疗中心的位置能够使得所有居民到医疗中心的总路程最短。具体来说,如果医疗中心建在某个村庄处,每个居民到医疗中心的距离是他们所在村庄与医疗中心所在村庄的路径长度。最终,需要在地图上找到一个最佳的村庄设立医疗中心,使得所有居民到达医疗中心的总距离最小。


这是一道经典的树形 dp 问题,我们考虑两种方法:自顶向下地推深度、自底向上递推结点和。

  • 自顶向下的方法:只需要在 dfs 函数的第一行递推,第二行更新结果,自己的子结点直接无脑递归,不用任何操作;
  • 自底向上的方法:dfs 函数的第一行先把自己的一部分推出来。遍历的时候,一开始就递归,而递归后子结点对应的值 sum[v] 已经推导完毕,且我们认为是正确的,然后根据它来更新 sum[u] 的值和最终答案。
#include<bits/stdc++.h>
using namespace std;
const int MAXN=1e3+8;
vector<int>adj[MAXN];
long long res,sum[MAXN];
int n,val[MAXN],dep[MAXN];
// void dfs(int u,int f){//自顶向下地推深度
//     dep[u]=dep[f]+1;
//     res+=1ll*val[u]*(dep[u]-1);
//     for(int v:adj[u])
//         if(v!=f)
//             dfs(v,u);
// }
void dfs(int u,int f){//自底向上递推结点和sum[u]=val[u];for(int v:adj[u]){if(v==f)continue;dfs(v,u);sum[u]+=sum[v];res+=sum[v];}
}
int main(){cin>>n;for(int u=1,f;u<=n;u++){cin>>val[u]>>f;if(f)adj[f].push_back(u),adj[u].push_back(f);}long long ans=1e18;for(int r=1;r<=n;r++)res=0,dfs(r,0),ans=min(ans,res);cout<<ans;return 0;
}

2. 【模板】树的直径

FJ 希望他的奶牛们加强锻炼,于是决定举办一场别开生面的奶牛马拉松。马拉松的路线图会包含一系列的农场,以及连接这些农场的双向道路。FJ 保证任意两个农场之间有且仅有一条路径。鉴于 FJ 希望奶牛们得到尽可能多的锻炼,他想请你帮他找出最长的马拉松路线,即在地图中找出相距最远的两个农场(两个农场之间的距离即这两个农场之间路径所包含的道路总长)之间的路线。


经典的树的直径求解问题。模板需要熟练背诵。

【推荐】方法 1:树形 dp

#include<bits/stdc++.h>
using namespace std;
const int MAXN=4e4+8;
struct Edge{int v,w;};
int n,m,ans,dp[MAXN];
vector<Edge>adj[MAXN];
void dfs(int u,int f){//自底向上for(auto[v,w]:adj[u]){if(v==f)continue;dfs(v,u);ans=max(ans,dp[u]+(dp[v]+w));//dp[u]+(dp[v]+w)表示以u为转折点连接其两个子树的最长路径dp[u]=max(dp[u],dp[v]+w);//dp[v]+w表示从u经过边(u,v)到v子树的最长路径}
}
int main(){cin>>n>>m;char ch;for(int i=1,x,y,d;i<=m;i++){cin>>x>>y>>d>>ch;adj[x].push_back({y,d});adj[y].push_back({x,d});}dfs(1,0);cout<<ans;return 0;
}

方法 2:两次 dfs

#include<bits/stdc++.h>
using namespace std;
const int MAXN=4e4+8;
struct Edge{int v,w;};
int n,m,dis[MAXN];
vector<Edge>adj[MAXN];
void dfs(int u,int f){for(auto[v,w]:adj[u])if(v!=f)dis[v]=dis[u]+w,dfs(v,u);
}
int main(){cin>>n>>m;char ch;for(int i=1,x,y,d;i<=m;i++){cin>>x>>y>>d>>ch;adj[x].push_back({y,d});adj[y].push_back({x,d});}dfs(1,0);int s=1;for(int i=2;i<=n;i++)if(dis[i]>dis[s])s=i;dis[s]=0,dfs(s,0);int t=1;for(int i=2;i<=n;i++)if(dis[i]>dis[t])t=i;cout<<dis[t];return 0;
}

3. 【模板】最大子树和

小明对数学饱有兴趣,并且是个勤奋好学的学生,总是在课后留在教室向老师请教一些问题。一天他早晨骑车去上课,路上见到一个老伯正在修剪花花草草,顿时想到了一个有关修剪花卉的问题。于是当日课后,小明就向老师提出了这个问题:
一株奇怪的花卉,上面共连有 NNN 朵花,共有 N−1N−1N1 条枝干将花儿连在一起,并且未修剪时每朵花都不是孤立的。每朵花都有一个“美丽指数”,该数越大说明这朵花越漂亮,也有“美丽指数”为负数的,说明这朵花看着都让人恶心。所谓“修剪”,意为:去掉其中的一条枝条,这样一株花就成了两株,扔掉其中一株。经过一系列“修剪“之后,还剩下最后一株花(也可能是一朵)。老师的任务就是:通过一系列“修剪”(也可以什么“修剪”都不进行),使剩下的那株(那朵)花卉上所有花朵的“美丽指数”之和最大。
老师想了一会儿,给出了正解。小明见问题被轻易攻破,相当不爽,于是又拿来问你。


一道模板题,和最大子段和问题一模一样,只不过是在树上。

#include<bits/stdc++.h>
using namespace std;
const int MAXN=1.6e4+8;
vector<int>adj[MAXN];
int n,val[MAXN],dp[MAXN];
void dfs(int u,int f){//自底向上dp[u]=val[u];for(int v:adj[u])if(v!=f)dfs(v,u),dp[u]+=max(dp[v],0);
}
int main(){cin>>n;for(int i=1;i<=n;i++)cin>>val[i];for(int i=1,u,v;i<n;i++)cin>>u>>v,adj[u].push_back(v),adj[v].push_back(u);dfs(1,0);int ans=-1e9;for(int u=1;u<=n;u++)ans=max(ans,dp[u]);cout<<ans;return 0;
}

4. 信号放大器

题目传送门


啊?这道题配当蓝题吗?啊?????

#include<bits/stdc++.h>
using namespace std;
const int MAXN=2e4+8;
int n,ra,ans,dp[MAXN];
struct Edge{int v,w;};
vector<Edge>adj[MAXN];
void dfs(int u,int f,int dis){for(auto[v,w]:adj[u])if(v!=f){dfs(v,u,w);dp[u]=max(dp[u],dp[v]+w);}if(dp[u]>=ra)ans=1e9;//如果当前结点的最大衰减路径超过信号强度,说明无法覆盖if(f!=0&&dis+dp[u]>=ra)ans++,dp[u]=0;//如果不是根结点,且从父结点到这里的衰减+当前子树最大衰减>=信号强度,//说明需要在当前结点安装放大器,同时重置当前路径的衰减计算
}
int main(){cin>>n;for(int u=1,k;u<=n;u++){cin>>k;for(int j=1,v,w;j<=k;j++)cin>>v>>w,adj[u].push_back({v,w});}cin>>ra;dfs(1,0,0);if(ans>=1e9)return cout<<"No solution.",0;cout<<ans;return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/89151.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/89151.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

楼宇自动化:Modbus 在暖通空调(HVAC)中的节能控制(一)

引言**在当今的建筑领域&#xff0c;楼宇自动化正扮演着愈发关键的角色&#xff0c;它致力于提升建筑的舒适度、安全性以及能源效率。而暖通空调&#xff08;HVAC&#xff09;系统作为楼宇自动化中的核心部分&#xff0c;其能耗在整个建筑能耗中占比相当高&#xff0c;据相关数…

【SpringBoot】注册条件+自动配置原理+自定义starter

注册条件注入到容器内实体类型对象的属性都是null&#xff0c;这些对象并没有什么实际的意义&#xff0c;因为实体类的对象就是来封装对象的&#xff0c;结果你这些对象中什么都没有&#xff1b;解决方法是1.给这些属性赋值然后再注入bean但是这些属性又是固定的不是很好&#…

Server reports Content-Length Mismatch 的根源与解决方案

“服务器声明604字节&#xff0c;Yum却期待28680字节”——当包管理器与仓库服务器之间的信任崩塌时&#xff0c;会发生什么&#xff1f;问题重现 yum install package_name ... Interrupted by header callback: Server reports Content-Length: 604 but expected size is: 28…

基于 Python/PHP/Node.js 的淘宝 API 商品数据抓取开发教程

在电商数据分析、竞品监控等场景中&#xff0c;抓取淘宝商品数据是常见需求。淘宝开放平台&#xff08;Open Platform&#xff09;提供了标准化的 API 接口&#xff0c;通过合法途径调用可高效获取商品信息。本文将分别基于 Python、PHP、Node.js 三种语言&#xff0c;详解淘宝…

【Tensor的创建】——深度学习.Torch框架

目录 1 Tensor概述 2 Tensor的创建 2.1 基本的创建方式 2.1.1 torch.tensor 2.1.2 torch.Tensor 2.2 创建线性和随机张量 2.2.1 创建线性张量 2.2.2 随机张量 1 Tensor概述 PyTorch会将数据封装成张量&#xff08;Tensor&#xff09;进行计算&#xff0c;张量就是元素为…

Python脚本批量修复文件时间戳,根据文件名或拍摄日期

实现以下功能 更正文件的 修改时间批量修改指定文件夹中的特定后缀的文件根据文件名中的日期修改&#xff08;优先&#xff09;根据 jpg 文件属性中的拍摄日期修改根据 mp4 文件属性中的创建媒体日期修改模拟运行&#xff08;Dry Run&#xff09;模式 依赖 若需要基于jpg文件属…

[Mysql] Connector / C++ 使用

一、Connector / C 使用 要使用 C 语言连接 MySQL&#xff0c;需要使用 MySQL 官网提供的库&#xff0c;可以去官网进行下载&#xff1a;MySQL :: MySQL Community Downloads 我们使用 C 接口库来进行连接&#xff0c;要正确使用&#xff0c;还需要做一些准备工作&#xff1a…

【PDF识别改名】使用京东云OCR完成PDF图片识别改名,根据PDF图片内容批量改名详细步骤和解决方案

京东云OCR识别PDF图片并批量改名解决方案一、应用场景在日常办公和文档管理中&#xff0c;经常会遇到大量 PDF 文件需要根据内容进行分类和命名的情况。例如&#xff1a;企业合同管理系统需要根据合同编号、日期等内容自动命名 PDF 文件图书馆数字化项目需要将扫描的图书章节按…

stm32-modbus-rs485程序移植过程

背景 【modbus学习笔记】Modbus协议解析_modus协议中0.001如何解析-CSDN博客 【Modbus学习笔记】stm32实现Modbus(从机)并移植_stm32 modbus数据处理-CSDN博客 继上篇成功移植modbus从机例程之后&#xff0c;我要尝试移植主机的程序。经提醒&#xff0c;可用野火的modbus代码…

Spring MVC 执行流程详解:一次请求经历了什么?

Spring MVC 执行流程详解&#xff1a;一次请求经历了什么&#xff1f; 引言 在现代 Web 开发中&#xff0c;Spring MVC 作为 Spring 框架的重要组成部分&#xff0c;广泛应用于构建灵活、可扩展的 Java Web 应用。作为一个基于 MVC&#xff08;Model-View-Controller&#xff0…

Vue 3的核心机制-解析事件流、DOM更新、数据请求、DOM操作规范及组件库DOM操作的解决方案

文章目录概要整体介绍vue 中dom操作推荐方案实例概要 从Vue 3的核心机制出发&#xff0c;结合场景、应用与实例&#xff0c;系统化解析事件流、DOM更新、数据请求、DOM操作规范及组件库DOM操作的解决方案&#xff1a; 整体介绍 ⚡️ 一、事件流处理机制 核心机制 • 三个阶段…

Python从入门到高手9.2节-Python字典的操作方法

目录 9.2.1 字典的操作 9.2.2 字典的查找 9.2.3 字典的修改 9.2.4 字典的添加 9.2.5 字典的删除 9.2.6 今天你逛街了吗 9.2.1 字典的操作 字典类型是一种抽象数据类型&#xff0c;抽象数据类型定义了数据类型的操作方法&#xff0c;在本节的内容中&#xff0c;教同学们彻…

omniparser v2 本地部署及制作docker镜像(20250715)

关于 omniparser v2 本地部署&#xff0c;网上资料不算多&#xff0c;尤其是对于土蔷内用户&#xff0c;还是有些坑的。 1、安装步骤 可参考两个CSDN博客&#xff1a; &#xff08;1&#xff09;大模型实战 - ‘OmniParser-V2本地部署安装 链接 &#xff08;2&#xff09;…

自己写个 `rsync` + `fswatch` 实时增量同步脚本,干掉 Cursor AI、Sublime Text 的SFTP等 插件!

自己写个 rsync fswatch 实时增量同步脚本&#xff0c;干掉 Cursor AI、Sublime Text 的 SFTP等 插件&#xff01; 作为一个码农&#xff0c;我最头疼的事情之一就是编辑器同步代码到服务器这块。用过各种各样的sftp、rsync插件&#xff0c;感觉不好用。。 我琢磨着&#xff1…

linux中at命令的常用用法。

Linux 中 at 命令用于安排一次性定时任务&#xff0c;需要用到在某个时间只需要执行一次的命令的时候&#xff0c;可以使用at 1&#xff1a;安装at # Debian/Ubuntu sudo apt install at# CentOS/RHEL sudo yum install at2&#xff1a;启动at sudo systemctl start atd # 启…

【安卓笔记】RxJava的使用+修改功能+搭配retrofit+RxView防快速点击

0. 环境&#xff1a; 电脑&#xff1a;Windows10 Android Studio: 2024.3.2 编程语言: Java Gradle version&#xff1a;8.11.1 Compile Sdk Version&#xff1a;35 Java 版本&#xff1a;Java11 1. 介绍RxJava GitHub开源地址&#xff1a;https://github.com/Reactive…

Windows 下原生使用 claude code + Kimi K2

搞定了kimi k2 claude code在windows下原生使用 Windows下使用claude code的障碍是shell环境&#xff08;命令行&#xff09;&#xff0c;非posix风格shell无法正常让claude code读取到url和key, 导致无法使用。解决问题的本质是使用符合posix风格的shell环境&#xff0c;我们…

Leetcode Easy题小解(C++语言描述)1

Leetcode Easy题小解&#xff08;C语言描述&#xff09; 相交链表 给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点&#xff0c;返回 null 。 图示两个链表在节点 c1 开始相交**&#xff1a;**题目数据…

EP01:【NLP 第二弹】自然语言处理概述

一、NLP通向智能之路 1.1 图灵测试 1.1.1 提出背景 由计算机科学家阿兰・图灵于 1950 年提出&#xff0c;是早期衡量机器智能水平的重要概念。 1.1.2 提出目的 判断机器是否能表现出与人类相当的智能行为。 1.1.3 测试原理 场景设定&#xff1a;测试中存在一位人类测试者&#…

Ansible 查看PostgreSQL的版本

Ansible的基础知识就不说了直接贴剧本- name: Check PostgreSQL versionhosts: db_serversbecome: yesvars:ansible_python_interpreter: /usr/bin/python3db_name: postgresdb_user: postgresdb_password: your_passwordtasks:- name: Install psycopg2ansible.builtin.packag…