首页 > 其他分享 >Living-Dream 系列笔记 第63期

Living-Dream 系列笔记 第63期

时间:2024-07-24 17:11:28浏览次数:11  
标签:Living cur int up len1 63 ans push Dream

树的中心

当选取树上节点 \(u\) 为根时,最长链最短,则称 \(u\) 为树的中心。

  • 性质一:至多 \(2\) 个且一定相邻。

  • 性质二:一定位于树的直径上。

  • 性质三:若一棵树有多条直径,则它们必定交于树的中心。

  • 性质四:树的中心为根时,根到直径两端点分别为最长 / 次长链。

U392706

板子。

code
#include<bits/stdc++.h>
using namespace std;

const int N=1e6+5;
int n;
struct E{
	int v,w;
};
vector<E> G[N];
vector<int> ans;
int len1[N],len2[N],up[N];

void dfsd(int cur,int fa){
	for(auto i:G[cur]){
		if(i.v==fa) continue;
		dfsd(i.v,cur);
		if(len1[i.v]+i.w>len1[cur])
			len2[cur]=len1[cur],
			len1[cur]=len1[i.v]+i.w;
		else if(len1[i.v]+i.w>len2[cur])
			len2[cur]=len1[i.v]+i.w;
	}
}
void dfsu(int cur,int fa){
	for(auto i:G[cur]){
		if(i.v==fa) continue;
		up[i.v]=up[cur]+i.w;
		if(len1[i.v]+i.w!=len1[cur])
			up[i.v]=max(up[i.v],len1[cur]+i.w);
		else
			up[i.v]=max(up[i.v],len2[cur]+i.w);
		dfsu(i.v,cur);
	}
}

int main(){
	cin>>n;
	for(int i=1,u,v,w;i<n;i++)
		cin>>u>>v>>w,
		G[u].push_back({v,w}),
		G[v].push_back({u,w});
	dfsd(1,0),dfsu(1,0);
	int mini=1e9;
	for(int i=1;i<=n;i++){
		if(mini>max(len1[i],up[i]))
			mini=max(len1[i],up[i]),ans.clear(),ans.push_back(i);
		else if(mini==max(len1[i],up[i]))
			ans.push_back(i);
	}
	sort(ans.begin(),ans.end());
	for(int i:ans) cout<<i<<'\n';
	return 0;
} 

CF1294F

显然三个点选两个树的直径上的点 \(u,v\) 更优。

至于第三个点 \(w\),我们可以认为 \(w\) 一定会与 \(u \to v\) 的路径交于 \(lca(w,v)\)。

于是枚举 \(w\) 求 LCA 并取最大即可,\(O(n \log n)\)。

当然更简单而高效的方法就是以 \(u \to v\) 上的点进行多起点 BFS 求最长路即可,\(O(n)\)。

这里提供的实现是法二。

code
#include<bits/stdc++.h>
using namespace std;

const int N=2e5+5;
int n;
int x,y,dis,pre[N];
int z,ans;
vector<int> G[N<<1];
bool vis[N];
struct Edge{ int u,sum; };

void dfs(int cur,int sum){
	if(sum>=dis) dis=sum,y=cur;
	for(int i:G[cur])
		if(i!=pre[cur])
			pre[i]=cur,dfs(i,sum+1);
}
void bfs(){
	queue<Edge> q;
	int now=y; //z=pre[y];
	while(now) 
		q.push({now,0}),vis[now]=1,now=pre[now];
	while(!q.empty()){
		Edge cur=q.front(); q.pop();
		if(cur.sum>=ans&&cur.u!=x&&cur.u!=y) ans=cur.sum,z=cur.u;
		for(int i:G[cur.u])
			if(!vis[i])
				q.push({i,cur.sum+1}),vis[i]=1;
	}
	
}

int main(){
	cin>>n;
	for(int i=1,u,v;i<n;i++)
		cin>>u>>v,
		G[u].push_back(v),
		G[v].push_back(u);
	pre[1]=0,dfs(1,0);
    x=y,pre[x]=0,dfs(x,0);
	bfs();
	cout<<dis+ans<<'\n'<<x<<' '<<y<<' '<<z;
	return 0;
} 

AT_agc001_c

反向思考,我们要求最少删除的点数,即是求最多保留的点数。

于是我们对于 \(k\) 进行奇偶性分讨,从而构造直径为 \(k\) 的树,在所有这些里面取保留点数最多的即可。

code
#include<bits/stdc++.h>
using namespace std;

const int N=2e3+5;
int n,k,tot,ans;
vector<int> G[N<<1];

void dfs(int cur,int fa,int sum){
	tot++;
	if(sum==k/2) return;
	for(int i:G[cur])
		if(i!=fa)
			dfs(i,cur,sum+1);
}

int main(){
	cin>>n>>k;
	for(int i=1,u,v;i<n;i++)
		cin>>u>>v,
		G[u].push_back(v),
		G[v].push_back(u);
	if(k%2==0)
		for(int i=1;i<=n;i++)
			tot=0,dfs(i,0,0),ans=max(ans,tot);
	else
		for(int i=1;i<=n;i++)
			for(int j:G[i])
				tot=0,dfs(i,j,0),dfs(j,i,0),ans=max(ans,tot);
	cout<<n-ans;
	return 0;
}

标签:Living,cur,int,up,len1,63,ans,push,Dream
From: https://www.cnblogs.com/XOF-0-0/p/18321270

相关文章

  • pg 关于表膨胀 转发:https://www.cnblogs.com/lottu/p/14549463.html
    对于PostgreSQL处理MVCC(数据文件中新增tuple)的方式;相比其他数据库(Oracle、Mysql)而言;更容易触发表/索引膨胀。因为update操作也会影响表膨胀的问题。PostgreSQL处理的方式是对表autovacuum,vacuum是不会降低水位线。能避免表、索引膨胀。vacuumfull,reindex才会降低水位线。当然......
  • AtCoder Beginner Contest 363
    AtCoderBeginnerContest363前言只出了三题,被d卡住了,事实上e题应该对我而言更简单,没及时换题。A-PilingUp(atcoder.jp)思路代码#include<bits/stdc++.h>usingnamespacestd;usingi64=longlong;intmain(){ios::sync_with_stdio(false);cin.......
  • 每日一题-P1263
    一眼匈牙利,没有紫啊#include<bits/stdc++.h>usingnamespacestd;#definepbpush_backintn,m,res,a[205][205],p[40005];intid1[205][205],fr1[40005],cnt1,id2[205][205],fr2[40005],cnt2;boolvis[40005];structedge{ intv,nx;}e[40005];intcnt,hd[40005];vo......
  • Living-Dream 系列笔记 第62期
    树的直径:定义:树上两个距离最远的点形成的简单路径(不重复走一条边/点)性质:不唯一。树的直径的端点一定是度数为\(1\)的点。证明:显然。树的直径若有多条,则必交汇于一点,即中心。证明:首先每条直径只能交于端点(因为是一棵树,一个节点不能有两个父节点),然后此交点必定......
  • UNS0881a-P,V1 3BHB006338R0001 可编程控制器PLC
    产品型号:UNS0881a-P,V13BHB006338R0001产品类别:可编程控制器PLC产品成色:全新、非全新质量保障:365天原产地;美国库存;有货品牌;ABBUNS0881a-P,V13BHB006338R0001控制板是一种电子设备,主要用于控制和管理各种电气设备。它通常由主控芯片、外设接口、电源模块、存储模......
  • ABC 363
    ABC363D-PalindromicNumber复盘一下几个细节:最后得到的\(n\)代表的是答案在长度为\(i\)的回文数中排第几,所以最终答案要加上长度更短的\(1\sim9\)是要算的长度奇偶的输出细节长度为\(1\simi\)的回文数个数\(10^{\frac{(i+1)}{2}}\)长度为\(i\)的回文数......
  • AtCoder Beginner Contest 363
    AtCoderBeginnerContest363PilingUp模拟题。点击查看代码#include<bits/stdc++.h>usingnamespacestd;inta;signedmain(){cin>>a;if(a%100!=0){a%=100;cout<<100-a;}else{cout<<100;}retur......
  • 代码随想录算法训练营第36天 | 动态规划基础2:62.不同路径、63.不同路径 II
    62.不同路径https://leetcode.cn/problems/unique-paths/submissions/548656029/代码随想录https://programmercarl.com/0062.不同路径.html63.不同路径IIhttps://leetcode.cn/problems/unique-paths-ii/description/代码随想录https://programmercarl.com/0063.不同路径......
  • ABC363 DEF 题解
    ABC363DEF题解前情提要:赛时过了ABCE。D-PalindromicNumber题目链接其实赛时已经看出了一些性质,但没想完做法,赛后看题解才发现这么简单/fn首先,为了方便,我们不把\(0\)视作回文数(因此需要特判一下\(n=1\)的情况)。下面要证明:\(d\)位回文数有\(10^{\left\lfloor\f......
  • AbMole| Sonidegib和Y-27632助力揭秘乳腺癌与骨转移新机制
     AbMole(奥默生物)是ChemBridge在中国的唯一官方指定合作伙伴。 近日由中科院上海营养与健康研究所的QiuYaoWu,GuoHongHu以及山东大学齐鲁医院的QiFengYang等多名研究人员在CellResearch期刊(IF=46)上,共同发表了题为“SCUBE2mediatesbonemetastasisofluminalbreast......