樹的DFS序列,時間戳,樹的深度,重心
阿新 • • 發佈:2018-11-21
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;
}