uva 1267 - Network
2013-10-29 17:14
393 查看
这个题目关键在于把无根树变成有根树;这个用dfs;
然后用贪心的方法,从最深的那层开始,每次找到节点的上k层,建一个服务器,然后用一个dfs把这个服务器能够覆盖的节点标记;
然后用贪心的方法,从最深的那层开始,每次找到节点的上k层,建一个服务器,然后用一个dfs把这个服务器能够覆盖的节点标记;
#include<cstdio> #include<cstring> #include<vector> #include<algorithm> #define maxn 1005 using namespace std; vector<int>node[maxn],deep[maxn]; bool vis[maxn]; int f[maxn],n,s,k; void dfs(int x,int fa,int d) { f[x]=fa; int l=node[x].size(); if(l==1&&d>k)deep[d].push_back(x); for(int i=0;i<l;i++) { int v=node[x][i]; if(v!=fa)dfs(v,x,d+1); } } void dfs2(int x,int fa,int d) { vis[x]=1; int l=node[x].size(); for(int i=0;i<l;i++) { int v=node[x][i]; if(v!=fa&&d<k)dfs2(v,x,d+1); } } int solve() { int ans=0; memset(vis,0,sizeof vis); for(int d=n-1;d>k;d--) { int l=deep[d].size(); for(int j=0;j<l;j++) { int v=deep[d][j]; if(!vis[v]) { for(int i=0;i<k;i++)v=f[v]; dfs2(v,-1,0); ans++; } } } return ans; } int main() { int t,x,y; scanf("%d",&t); while(t--) { scanf("%d%d%d",&n,&s,&k); for(int i=1;i<=n;i++) { node[i].clear(); deep[i].clear(); } for(int i=0;i<n-1;i++) { scanf("%d%d",&x,&y); node[x].push_back(y); node[y].push_back(x); } dfs(s,-1,0); printf("%d\n",solve()); } return 0; }
相关文章推荐
- UVa:1267 Network
- UVA - 1267 Network
- 【UVA1267】Network
- UVA - 1267 Network
- [UVa 1267]Network
- LA 3902 UVA 1267 - Network
- uva1267 Network
- UVA 1267 Network(dfs)
- UVa 1267 Network (DFS&贪心)
- uva 1267 Network
- LA 3902 UVA 1267 - Network
- uva 1267 Network(DFS)
- uva1267 - Network
- Uva 1267 Network 解题报告(贪心搜索)
- UVA 1267 - Network
- UVA 1267 - Network(贪心DFS)
- 【树形贪心】【UVA1267】Network
- uva 1267 - Network(dfs)
- UVA 1267 && LA 3902 Network (思路--树上的DFS)
- 【树形贪心】【UVA1267】Network