树的DFS序列,时间戳,树的深度,重心

版权声明:转载请在原文附上源连接以及作者,谢谢~ https://blog.csdn.net/weixin_39778570/article/details/83833678

ACM题集:https://blog.csdn.net/weixin_39778570/article/details/83187443

  • 树的DFS序,时间戳
/*树的DFS序*/
#include<bits/stdc++.h>
#define ll long long
#define fo(i,j,n) for(register int i=j; i<=n; ++i)
using namespace std;
const int maxn = 1e6+5;
int nxt[maxn],head[maxn],ver[maxn],deg[maxn],tot;
void add(int x,int y){
	ver[++tot]=y, nxt[tot]=head[x], head[x]=tot;
}
// 树的DFS序 
int a[maxn],vis[maxn],m;
void dfs(int x){
	a[++m] = x; // a数组储存DFS序
	vis[x] = 1;
	for(int i=head[x]; i; i=nxt[i]){
		int y=ver[i];
		if(vis[y])continue;
		dfs(y);
	} 
	a[++m] = x;
}
// 时间戳 
int st[maxn],ed[maxn],t;
void dfs1(int x){
	st[x] = ++t;
	vis[x] = 1;
	for(int i=head[x]; i; i=nxt[i]){
		int y=ver[i];
		if(vis[y])continue;
		dfs1(y);
	}
	ed[x] = ++t;
} 
int main(){
	
	return 0;
} 
  • 树的深度,重心
#include<bits/stdc++.h>
#define ll long long 
using namespace std;
const int maxn = 1e6+5;
int nxt[maxn],head[maxn],ver[maxn],tot;
void add(int x,int y){
	ver[++tot]=y, nxt[tot]=head[x], head[x]=tot;
}
int d[maxn],vis[maxn];
int n;
// 树的深度
void dfs(int x){
	vis[x]=1;
	for(int i=head[x]; i; i=nxt[i]){
		int y=ver[i];
		if(vis[y])continue;
		d[y]=d[x]+1;
		dfs(y);
	}
} 
// 树的重心 找到任意一个点,去掉这个点生成的所有子树中找到最大的子树M, 
// 在所有点中找到一个点最小化子树M的大小
int size[maxn];// 子树的大小 
int ans=maxn,pos; // 
void dfs1(int x){
	vis[x]=1; size[x]=1; // 子树x的大小
	int max_part = 0;    // 删除x这个点后分成的最大子树的大小
	for(int i=head[x]; i; i=nxt[i]){
		int y = ver[i];
		if(vis[y])continue;
		dfs1(y);
		size[x] += size[y]; // 从子节点向父节点递推 
		max_part = max(max_part, size[y]); 
	} 
	max_part = max(max_part, n-size[x]); // n为整棵树节点的数目
	if(max_part < ans){
		ans = max_part;  // 全局变量记录重心对应的max_part值 
		pos = x;         // 全局变量记录重心 
	} 
} 
int main(){
		
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_39778570/article/details/83833678