您的位置:首页 > 其它

uvaoj 1267 - Network

2015-11-15 01:05 369 查看
题解:

1.贪心,把树的任意一点作为树根,这棵有根树的‘最深叶子节点’的最优服务安装位置是确定的!

总结:

1.这道题没有自己想出来,憋了好久好久啊!总结一下,现在总是习惯性的躺在床上才想题,丢掉了在纸上随意画一画的习惯了,导致总是在一个地方纠结而没有看到那里没有想到!(画在纸上可能更能帮助完善思维)

2.这道题目的一个关键是把无根树想成有根树!无形中加强了条件,以后再去从极端的地方入手,也许就能思考出问题了

3.下次如果再想不出来问题,早点看答案,先就看一句解释,然后再继续思考

#include<iostream>
#include<cstring>
#include<cstdio>
#include<vector>
using namespace std;
#define MAXN 1005
vector<int>vec[MAXN],deep[MAXN];
int _,n,k,s,ans,father[MAXN];
bool covered[MAXN];
void dfs(int u,int fa,int d)
{
if(vec[u].size() == 1)
{
covered[u] = true;
return;
}
if(d == 0)return;
for(int i = 0;i < vec[u].size();i++)if(vec[u][i] != fa)
dfs(vec[u][i],u,d - 1);
}
void pre_dfs(int u,int fa,int d)
{
if(vec[u].size() == 1 && u != s)
{
deep[d].push_back(u);
return;
}
for(int i = 0;i < vec[u].size();i++)
{
int v = vec[u][i];
if(v == fa)continue;
father[v] = u;
pre_dfs(v,u,d + 1);
}
}
void solve()
{
pre_dfs(s,-1,1);
dfs(s,-1,k);
for(int d = n;d >= 1;d--)
for(int i = 0;i < deep[d].size();i++)
{
int u = deep[d][i];
if(covered[u])continue;
int fa = u;
for(int i = 0;i < k;i++)
fa = father[fa];
dfs(fa,-1,k);
ans++;
}
}
int main()
{
cin >> _;
while(_--)
{
cin >> n >> s >> k;
for(int i = 1;i <= n;i++)
vec[i].clear(),deep[i].clear();
memset(covered,0,sizeof(covered));
ans = 0;
for(int i = 1;i < n;i++)
{
int u,v;
cin >> u >> v;
vec[u].push_back(v);
vec[v].push_back(u);
}
solve();
cout << ans << endl;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息