UVA 1267 Network(dfs)
2016-09-30 13:03
441 查看
先把s节点作为根节点,建立一棵树,k层以上是不用管的,把k层以下的叶子结点放到node数组中,最下面的叶子结点网上走k-1层,然后当前节点作为根,建树,重复循环直到所有的点都被覆盖为止。
// // main.cpp // Richard // // Created by 邵金杰 on 16/9/30. // Mail:1016427040@qq.com or jasonshaosjj@gmail.com // Copyright © 2016年 邵金杰. All rights reserved. // #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<vector> using namespace std; const int maxn=1000+10; vector<vector<int> > G(maxn),node(maxn); int n,s,k; int fa[maxn]; int covered[maxn]; void dfs1(int u,int f,int d) { fa[u]=f; int nc=(int)G[u].size(); if(nc==1&&d>k) node[d].push_back(u); for(int i=0;i<G[u].size();i++){ int v=G[u][i]; if(v!=f) dfs1(v,u,d+1); } } void dfs2(int u,int f,int d) { covered[u]=1; for(int i=0;i<G[u].size();i++){ int v=G[u][i]; if(v!=f&&d<k) dfs2(v,u,d+1); } } int solve() { int ans=0; memset(covered,0,sizeof(covered)); for(int d=n-1;d>k;d--) { for(int i=0;i<node[d].size();i++){ int p=node[d][i]; if(covered[p]) continue; int v=p; for(int j=0;j<k;j++) v=fa[v]; dfs2(v,-1,0); ans++; } } return ans; } int main() { int t; scanf("%d",&t); while(t--) { int u,v; scanf("%d%d%d",&n,&s,&k); for(int i=0;i<=n;i++) G[i].clear(),node[i].clear(); for(int i=0;i<n-1;i++) { scanf("%d%d",&u,&v); G[u].push_back(v); G[v].push_back(u); } dfs1(s,-1,0); printf("%d\n",solve()); } return 0; } //2 14 //12 2 //1 2 //2 3 //3 4 //4 5 //5 6 //7 5 //8 5 //4 9 //10 3 //2 12 //12 14 //13 14 //14 11
相关文章推荐
- UVa 1267 Network (DFS&贪心)
- UVA 1267 && LA 3902 Network (思路--树上的DFS)
- uva 1267 - Network(dfs)
- UVA 1267 - Network(贪心DFS)
- uva 1267 Network(DFS)
- uva 1267 - Network(dfs)
- UVA - 1267 Network
- UVALive3902 Network[贪心 DFS&&BFS]
- UVa:1267 Network
- uva1267(无根树 +dfs)
- UVA 1267 - Network
- LA 3902 UVA 1267 - Network
- Uva 1267 Network 解题报告(贪心搜索)
- LA 3902 UVA 1267 - Network
- uva 1267 - Network
- 【树形贪心】【UVA1267】Network
- uva1267 Network
- 【UVA1267】Network
- 【树形贪心】【UVA1267】Network
- [UVa 1267]Network