版权声明:转载请在原文附上源连接以及作者,谢谢~ 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;
}