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

UVALive 3902 网络

2016-07-05 20:09 393 查看
https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2515
http://7xjob4.com1.z0.glb.clouddn.com/c6a2a6f54f5a6c2cae2c82df2ec552f7
题意:给网络图,叶节点是客户端,其他是服务器,设置最少的服务数在服务器上使客户端到服务的距离不超过指定值

思路:将已有的那个服务作根,转换图至有根树,记录各叶子节点的深度;选深度最大的叶节点的 指定值距离 的父亲节点作为设置服务最划算,设置后dfs覆盖状态,只需处理深度大于指定值的叶子节点。

#include <bits/stdc++.h>
using namespace std;

const int maxn=1005;
vector <int> gr[maxn],nodes[maxn];
int n,s,k,fa[maxn];
bool covered[maxn];

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

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

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

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

int main()
{
int T;
int i,j;
scanf("%d",&T);
while(T--)
{
scanf("%d%d%d",&n,&s,&k);
for(i=0;i<=n;i++)
{
gr[i].clear();
nodes[i].clear();
}
for(i=1;i<n;i++)
{
int u,v;
scanf("%d %d",&u,&v);
gr[u].push_back(v);
gr[v].push_back(u);
}
dfs(s,-1,0);
printf("%d\n",solve());
}
return 0;
}


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