2007LA 3902 网络(树+贪心)

原创 2013年12月10日 23:41:30

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\n", solve());
	}
	return 0;
}


贪心法之最小生成树之Kruskal算法

A,实际应用:现实生活中经常需要计算某种方案的最小成本问题,比如希望利用最少量的电缆线连接一座建筑物中所有的计算机;再比如希望以最小的成本连接一个网络中的所有路由器等问题。把整个问题抽象成一个无向图,...
  • shimin520shimin
  • shimin520shimin
  • 2015年10月08日 08:40
  • 1382

哈夫曼树-贪心算法的应用实例

/* *哈夫曼编码-链式结构 * *功能实现: * 源文件字符权值确认操作 * 哈夫曼树的建立操作 * 字符字典的建立操作 * 源文件转码操作操作 * 二进制文件译码操作 * 文件输出操作...
  • a915650754
  • a915650754
  • 2014年12月07日 23:11
  • 1364

经典算法6:贪心算法之最小生成树

1、问题描述      设G =(V,E)是无向连通带权图,即一个网络。E中每条边(v,w)的权为c[v][w]。如果G的子图G’是一棵包含G的所有顶点的树,则称G’为G的生成树。生成树上各边权...
  • u011131296
  • u011131296
  • 2013年06月27日 13:19
  • 1533

树(网络,LA 3902)

可能是因为做了很多树形DP,而很少做其他题的缘故,我总希望通过一遍或几遍DFS来完成预处理以及计算答案。这样的思路是十分狭隘的。一开始想让树的重心或者中心来做根,然后dfs下去,找到一个最上面的点做服...
  • xl2015190026
  • xl2015190026
  • 2016年10月24日 15:41
  • 118

《算法竞赛-训练指南》第一章-1.15_LA 3902

这道题目我真的有点泪奔了! 写了整整一下午才A掉,这是一道比较考察综合知识的题目,要求你对DFS,要求你对模型的建立,要求你对图的掌握要非常熟练。如果是不熟练的话,你是写不出来的。 这个题...
  • qinaide_lixiaoshuo
  • qinaide_lixiaoshuo
  • 2013年07月19日 19:11
  • 565

LA 4731 蜂窝网络(简单dp+贪心)

题意: 手机在蜂窝网络中的定位是一个基本问题,假设蜂窝网络已经得知手机处于c1,c2,,,cn这些区域中的一个,最简单的方法是同时在这些区域中寻找手机,但这样做很浪费带宽,由于蜂窝网络中可以得知手...
  • hjt_fathomless
  • hjt_fathomless
  • 2016年09月05日 10:23
  • 318

LA3902 Network (树上dfs)

题目链接:点击打开链接 题意:n台机器连成一个树状网络,其中叶节点是客户端,其他节点是服务器,目前有一台服务器s正在提供服务。让你在其他服务器上也安排同样的服务,使得每台客户端到最近服务器的距离不超过...
  • Kirito_Acmer
  • Kirito_Acmer
  • 2016年03月30日 12:42
  • 385

LA3902 Network

#include #include #include #include #include using namespace std; const int maxn=1010; vectorgr...
  • q295657451
  • q295657451
  • 2014年02月17日 19:47
  • 465

UVA 1267 && LA 3902 Network (思路--树上的DFS)

大体题意: 给你n 个节点的树,其中叶子节点是客户端,内部的节点是服务器!你需要把一些服务器变成VOD,使得每个客户端到最近VOD的距离不超过K,开始的时候,已经有了一个VOD ,标号是s(也是根节...
  • aozil_yang
  • aozil_yang
  • 2016年12月06日 15:43
  • 192

贪心算法之子段和,山东省第八届acm大赛J题company,SDUT3902

company Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Discuss Problem Descripti...
  • winter2121
  • winter2121
  • 2017年05月11日 21:03
  • 505
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:2007LA 3902 网络(树+贪心)
举报原因:
原因补充:

(最多只允许输入30个字)