Tree with Small Distances
Tree with Small Distances
https://ac.nowcoder.com/acm/problem/113026
思路
- 1.先对树从根结点进行一遍dfs求出每个点的深度
- 2.用大根堆把不满足要求的点存起来
- 3.按深度从大到小依次把该点的父亲结点与根结点相连
- 4.更新父亲结点和它的子节点的状态
代码
// Problem: Tree with Small Distances // Contest: NowCoder // URL: https://ac.nowcoder.com/acm/problem/113026 // Memory Limit: 524288 MB // Time Limit: 2000 ms // Powered by CP Editor (https://github.com/cpeditor/cpeditor) #include <bits/stdc++.h> using namespace std; #define pb push_back #define mp(aa,bb) make_pair(aa,bb) #define _for(i,b) for(int i=(0);i<(b);i++) #define rep(i,a,b) for(int i=(a);i<=(b);i++) #define per(i,b,a) for(int i=(b);i>=(a);i--) #define mst(abc,bca) memset(abc,bca,sizeof abc) #define X first #define Y second #define lowbit(a) (a&(-a)) typedef long long ll; typedef pair<int,int> pii; typedef unsigned long long ull; typedef long double ld; const int N=200010; const int INF=0x3f3f3f3f; const int mod=1e9+7; const double eps=1e-6; const double PI=acos(-1.0); vector<int> g[N]; int dep[N],fa[N],ans; priority_queue<pii> q; bool vis[N]; void dfs(int u,int father){ for(int v:g[u]){ if(father==v) continue; dep[v]=dep[u]+1; fa[v]=u; dfs(v,u); } } void solve(){ int n;cin>>n; _for(i,n-1){ int x,y;cin>>x>>y; g[x].pb(y); g[y].pb(x); } dfs(1,0); rep(i,1,n){ if(dep[i]>2) q.push({dep[i],i}); } while(q.size()){ auto t=q.top();q.pop(); int v=t.Y; if(vis[v]) continue; int u=fa[v]; vis[u]=1; for(int v:g[u]) vis[v]=1; ans++; } cout<<ans; } int main(){ ios::sync_with_stdio(0);cin.tie(0); // int t;cin>>t;while(t--) solve(); return 0; }
牛客每日一题 文章被收录于专栏
水