zoukankan      html  css  js  c++  java
  • 2007LA 3902 网络(树+贪心)

    https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&category=283&page=show_problem&problem=1903

    题意:在一个树状的网络中,提供VOD服务,叶子节点是客户端,其他是服务器,要减少网络延迟,所以要在其他的服务器也安装同样的服务,使得每台客户端到最近服务器的距离不超过k,求最少安装服务的服务器。

    思路:一个关键点是选择u节点的k级祖先是最优的,因为覆盖的范围最广,所以我们构造出一颗有根树,从下往上遍历叶子节点,看是否被覆盖,没有则在k级祖先安装服务。

    #include <iostream>
    #include <vector>
    using namespace std;
    
    #define MAXN 1010
    vector<int> link[MAXN];//存树
    vector<int> node[MAXN];//存第i层节点
    
    int n, s, k, father[MAXN];
    bool used[MAXN];
    
    void dfs(int u, int fa, int d)//无根树转有根树,计算father数组,根据深度插入node表
    {
    	father[u] = fa;
    	int size = link[u].size();
    	if (size == 1 && d > k) node[d].push_back(u);//一个
    	for (int i = 0; i < size; i++)				 //多个
    	{
    		if (link[u][i] != fa) dfs(link[u][i], u, d + 1);
    	}
    }
    
    void dfs2(int u, int fa, int d)
    {
    	used[u] = true;
    	for (int i = 0; i < link[u].size(); i++)
    	{
    		if (link[u][i] != fa && d < k) dfs2(link[u][i], u, d + 1);
    	}
    }
    
    int solve()
    {
    	int ans = 0;
    	memset(used, 0, sizeof(used));
    	for (int d = n - 1; d > k; d--)
    	{
    		for (int i = 0; i < node[d].size(); i++)
    		{
    			int u = node[d][i];
    			if (!used[u]) //未被覆盖
    			{
    				int tmp = u;
    				for (int j = 0; j < k; j++) tmp = father[tmp];//tmp是u的k级祖先
    				dfs2(tmp, -1 ,0);
    				ans ++;
    			}
    		}
    	}
    	return ans;
    }
    
    int main()
    {
    	int T;
    	cin>>T;
    	while (T--)
    	{
    		cin>>n>>s>>k;
    		for (int i = 1; i <= n; i++) 
    		{
    			link[i].clear();
    			node[i].clear();
    		}
    		for (i = 0; i < n - 1; i++)
    		{
    			int a, b;
    			cin>>a>>b;
    			link[a].push_back(b);
    			link[b].push_back(a);
    		}
    		dfs(s, -1, 0);//节点,父节点,深度
    		printf("%d
    ", solve());
    	}
    	return 0;
    }


  • 相关阅读:
    【题解】NOIP2016换教室
    【题解】平面最近点对(加强版)
    [atcoder002E] Candy Piles [博弈论]
    [AGC002D] Stamp Rally [并查集+整体二分]
    [ACG001E] BBQ hard [dp]
    [BJOI2006][bzoj1001] 狼抓兔子 [最小割]
    [usaco jan 09] 安全路径 travel [最短路径树]
    [usaco jan 09] 气象牛 baric [dp]
    [poj1741] tree [点分治]
    [NOI2009] 植物大战僵尸 [网络流]
  • 原文地址:https://www.cnblogs.com/riasky/p/3468879.html
Copyright © 2011-2022 走看看