您的位置:首页 > 理论基础 > 计算机网络

LA 3902 网络

2017-04-12 22:13 232 查看
题目链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1903

题意:

n 台计算机,n-1条边成树,有一个服务器,给定一个 k ,要求所有叶子结点,距离服务器的距离 <=k; 所以要在一些地方放服务器;

问最少要放多少个服务器?

#include <bits/stdc++.h>

using namespace std;

const int maxn = 1000 + 10;

int n,s,k;
vector<int> gr[maxn],nodes[maxn];

int fa[maxn];
void dfs(int u,int f,int d)
{
fa[u] = f;
int nc = gr[u].size();
if(nc==1&&d>k) nodes[d].push_back(u);
for(int i=0; i<nc; i++)
{
int v = gr[u][i];
if(v!=f)
dfs(v,u,d+1);
}
}

bool covered[maxn];

void dfs2(int u,int f,int d)
{
covered[u] = true;
int nc = gr[u].size();
for(int i=0; i<nc; i++)
{
int v = gr[u][i];
if(v!=f&&d<k)
dfs2(v,u,d+1);
}
}

int solve()
{
int ans = 0;
memset(covered,0,sizeof(covered));
for(int d=n-1; d>k; d--)
{
for(int i=0; i<nodes[d].size(); i++)
{
int u = nodes[d][i];
if(covered[u])
continue;

int v = u;
for(int j=0; j<k; j++)
v = fa[v];
dfs2(v,-1,0);
ans++;
}
}
return ans;
}

int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d%d%d",&n,&s,&k);
for(int i=1; i<=n; i++)
{
gr[i].clear();
nodes[i].clear();
}

for(int i=0; i<n-1; i++)
{
int a,b;
scanf("%d%d",&a,&b);
gr[a].push_back(b);
gr[b].push_back(a);
}

dfs(s,-1,0);
printf("%d\n",solve());
}

return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: