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;
    }


  • 相关阅读:
    Homebrew 更改国内阿里源
    Java数组以及内存分配
    Django-Scrapy生成后端json接口
    MySQL必知必会(1-12章)
    招聘网站爬虫模板
    ubuntu之jupyter notebook配置
    服务器基本配置(ubuntu)
    Typora+PicGo+码云Gitee搭建本地博客环境
    redis缓存雪崩,穿透,击穿。整理篇
    鼠标修复升级记录(下)
  • 原文地址:https://www.cnblogs.com/riasky/p/3468879.html
Copyright © 2011-2022 走看看