树上最优解+贪心+dfs+LA3902
来源:互联网 发布:300英雄血盟桐人淘宝 编辑:程序博客网 时间:2024/05/20 03:38
第一个dfs计算出叶结点的深度,第二个又来标记安放一个服务器后可以覆盖那些节点。
下面是代码:
#include<iostream>#include<vector>#include<cstring>#include<algorithm>#include<cstdio>using namespace std;const int maxn=1010;int n,s,k,fa[maxn];vector<int> gr[maxn],nodes[maxn];bool cover[maxn];void dfs(int u,int f,int d){ fa[u]=f; if(gr[u].size()==1&&d>k) nodes[d].push_back(u); for(int i=0;i<gr[u].size();i++) { int v=gr[u][i]; if(v!=f) dfs(v,u,d+1); }}void dfs2(int u,int f,int d){ cover[u]=true; for(int i=0;i<gr[u].size();i++) { if(gr[u][i]!=f&&d<k) dfs2(gr[u][i],u,d+1); }}int solve(){ int ans=0; memset(cover,0,sizeof(cover)); for(int d=n-1;d>k;d--) { for(int i=0;i<nodes[d].size();i++) { int u=nodes[d][i]; if(!cover[u]) { int v=u; for(int j=0;j<k;j++) v=fa[v]; dfs2(v,-1,0); ans++; } } } return ans;}int main(){ #ifndef ONLINE_JUDGE freopen("in.txt","r",stdin); #endif int t; cin>>t; while(t--) { cin>>n>>s>>k; for(int i=1;i<=n;i++) { gr[i].clear(); nodes[i].clear(); } for(int i=0;i<n-1;i++) { int a,b; cin>>a>>b; gr[a].push_back(b); gr[b].push_back(a); } dfs(s,-1,0); cout<<solve()<<endl; } return 0;}
0 0
- 树上最优解+贪心+dfs+LA3902
- LA3902 Network (树上dfs)
- LightOJ 1219 Mafia(dfs—树上贪心)
- LA3902
- uva1267Network 树上的最优问题
- 用贪心算法求最优解
- 搜索最优解算法之贪心算法
- 树上dfs + 思维
- codeforces 树上dfs
- uva12186 树上的dfs
- 最优装载(贪心)
- 贪心-最优装载问题
- 最优分解(贪心)
- 贪心,最优装载问题
- 贪心算法-最优装载
- 【贪心】最优合并问题
- [贪心+DFS序列维护树上前缀和]2014 Multi-University Training Contest 5 - 1002 Paths on the tree
- POJ 1192 最优连通子集(树上DP)
- java 反射
- Jframe任务栏图标隐藏
- 简单成绩管理
- android网络开源框架volley(三)——请求队列是主线
- ubuntu安装eclipse 和tomcat
- 树上最优解+贪心+dfs+LA3902
- stl map
- 2013-01-02总结
- 2013秋13级预备队集训练习4 --B - Steps
- Activity的启动模式
- 新恋爱时光
- strtok
- ibatis 批量更新
- 韩流来袭