题目
思路
有一个很明显的性质,两个消防局之间的距离越长越好,
有了这个性质之后就可以开始贪心了
定义
d
i
s
[
u
]
dis[u]
dis[u]为u节点距离消防站的距离
之后我们可以求出u节点的儿子节点的
d
i
s
[
s
o
n
]
dis[son]
dis[son]的最大值和最小值
如果
m
a
x
x
−
m
i
n
n
<
=
3
maxx-minn<=3
maxx−minn<=3
则
d
i
s
[
u
]
=
m
i
n
n
+
1
dis[u]=minn+1
dis[u]=minn+1
否则就是
d
i
s
[
u
]
=
m
a
x
x
+
1
dis[u]=maxx+1
dis[u]=maxx+1
关于dis的初始化
叶子节点的dis为3
代码
#include<iostream>
#include<vector>
#include<climits>
using namespace std;
int n;
int ans;
vector<int> g[1005];
int dis[1005];
bool f[1005];
void dfs(int u,int fa)
{
int minn=INT_MAX;
int maxx=INT_MIN;
for(int i=0;i<g[u].size();i++)
{
int v=g[u][i];
dfs(v,u);
minn=min(minn,dis[v]);
maxx=max(maxx,dis[v]);
}
if(g[u].size()==0)
{
dis[u]=3;
}
else
{
if(maxx+minn<=3)
{
dis[u]=minn+1;
}
else
{
dis[u]=maxx+1;
}
}
if(dis[u]==5)
{
dis[u]=0;
ans++;
}
if(dis[u]>=3&&fa==0)
ans++;
return;
}
int main()
{
cin>>n;
for(int i=2;i<=n;i++)
{
int e;
cin>>e;
g[e].push_back(i);
}
dfs(1,0);
cout<<ans;
return 0;
}