1. 程式人生 > >樹的DFS序列,時間戳,樹的深度,重心

樹的DFS序列,時間戳,樹的深度,重心

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; }