LA 3902 Network

  贪心的思想吧,对于每一个还没被覆盖到的叶子节点,最优的选择就是他的k级祖先(节点的父亲为1级祖先)。

  记录下各深度的叶子节点,这对于这些节点选择一个最优的祖先节点,然后从选出的这个祖先节点向外扩展,把该点能覆盖到的叶子节点全都标记。按深度从深到浅使每个叶子节点都被覆盖后,既是ans

  

#include <map>
#include <cmath>
#include <cstdio>
#include <vector>
#include <string>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = 1005;
vector<int>f[maxn],depth[maxn];
int fa[maxn],vis[maxn],flag[maxn];
int n,s,k;
void build(int rt,int d)
{
    vis[rt] = 1;
    int len = f[rt].size();
    if(len==1 && d>k)depth[d].push_back(rt);
    for(int i = 0;i<len;++i)
    {
        int u = f[rt][i];
        if(vis[u])continue;
        fa[u] = rt;
        build(u,d+1);
    }
}
void dfs(int rt,int d)
{
    vis[rt] = 1;
    int len = f[rt].size();
    if(len==1 && d<=k){flag[rt]=1;return;}
    for(int i = 0;i<len;++i)
    {
        int u = f[rt][i];
        if(!vis[u])dfs(u,d+1);
    }
}
int main()
{
//    freopen("in.txt","r",stdin);
    int T;scanf("%d",&T);
    while(T--)
    {
        memset(f,0,sizeof(f));
        memset(vis,0,sizeof(vis));
        memset(flag,0,sizeof(flag));
        memset(depth,0,sizeof(depth));
        scanf("%d%d%d",&n,&s,&k);
        for(int i = 1;i<n;++i)
        {
            int u,v;scanf("%d%d",&u,&v);
            f[u].push_back(v);
            f[v].push_back(u);
        }
        build(s,0);
        int ans = 0;
        for(int i = n;i>k;--i)
        {
            int len = depth[i].size();
            for(int j = 0;j<len;++j)
            {
                int u = depth[i][j];
                if(flag[u])continue;
                memset(vis,0,sizeof(vis));
                for(int i = 0;i<k;++i)u = fa[u];
                dfs(u,0);
                ans++;
            }
        }
        printf("%d\n",ans);
    }
    return 0;
}
时间: 2024-10-10 07:06:33

LA 3902 Network的相关文章

[2016-03-19][UVALive][3902][Network]

时间:2016-03-19 18:41:09 星期六 题目编号:[2016-03-19][UVALive][3902][Network] 题目大意:给定一个树状的图,一个服务器能覆盖k范围内的人,已知一个服务器的位置,问至少需要多少个服务器才能覆盖所有的叶子节点 分析: 以第一个服务器的点为根,把无根树转换为有根树 要使每个叶子节点都被覆盖,那么叶子节点的k级祖先内必须有一个服务器 要使服务器最少,服务器应该放在最远的位置 方法: dfs1得到每层深度的节点(k层以内的就不用记录),同时记录每个

Live Archive 3902 Network 【持续更新】

3902 - Network Asia - Seoul - 2007/2008 Consider a tree network with n nodes where the internal nodes correspond to servers and the terminal nodes correspond to clients. The nodes are numbered from 1 to n . Among the servers, there is an original ser

Uva 网络(Network,Seoul 2007,LA 3902)

1 #include<iostream> 2 #include<cstring> 3 #include<vector> 4 using namespace std; 5 6 const int maxn=1000+10; 7 int n,s,k; 8 vector<int> tree[maxn],nodes[maxn]; 9 int fa[maxn]; 10 bool covered[maxn]; 11 12 void dfs(int u,int f,int

LA 3902 网络

题目链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1903 题意: n 台计算机,n-1条边成树,有一个服务器,给定一个 k ,要求所有叶子结点,距离服务器的距离 <=k: 所以要在一些地方放服务器: 问最少要放多少个服务器? 图中要在 4 号结点放一个服务器,k = 2; 分析: 1.无根树要转有根树 从下往上

Uva 3902 Network

题目大意: 在非叶子节点上安装最少的服务器使得,每个叶子节点到服务器的距离不超过k. 贪心+图上的dfs. 先从深度最大的叶子节点开始找.找到父节点后再用这个父节点进行扩充. /* *********************************************** Author :guanjun Created Time :2016/5/10 23:15:38 File Name :7.cpp *********************************************

LA 3902

之前对树的处理一般是从根节点开始递归处理.今天学习了一种新方法,根据层的深浅处理.即,1.首先得到每个节点的深度 2.然后从最底层开始处理.(貌似是宽搜的逆处理) 题意:给出一个棵树,从根节点向叶节点发信息.如果距离大于k就无法发送信息(节点之间的距离为1). 为了能够给所有叶节点传送到信息,需要在树立增加一些服务器,这些服务器也能发送信息,如果一个叶节点离最近的服务器距离不超过k,那么也认为这个叶节点是接收到信息的.求最少需要增加多少个服务器可以让所有的叶节点都能收到信息. 思路:开始的时候就

UVALive3902 Network[贪心 DFS&amp;&amp;BFS]

UVALive - 3902 Network Consider a tree network with n nodes where the internal nodes correspond to servers and the terminal nodes correspond to clients. The nodes are numbered from 1 to n. Among the servers, there is an original server S which provid

[LA] 3027 - Corporative Network [并查集]

A very big corporation is developing its corporative network. In the beginning each of the N enterprises of the corporation, numerated from 1 to N, organized its own computing and telecommunication center. Soon, for amelioration of the services, the

(DS 《算法竞赛入门经典》)LA 3027 Corporative Network(查询某一个节点到根节点之间的距离)

题目大意: 查询某一个节点到根节点之间的距离 解题思路: 加权并查集问题.之前做的题目是"查看两个或多个节点是否在同一个集合下",现在的题目是"查询某个节点到 根节点之间的距离".之前只需要使用到father[x]这个数组,用来表示x的父亲节点是谁.现在引入dist[x]数组,用来记录 x节点到根节点的距离 1)在并查集中,根节点不懂,其他节点都可以动. A very big corporation is developing its corporative net