习题:消防局的设立(贪心)

 

题目

传送门

思路

有一个很明显的性质,两个消防局之间的距离越长越好,
有了这个性质之后就可以开始贪心了
定义dis[u]dis[u]dis[u]为u节点距离消防站的距离
之后我们可以求出u节点的儿子节点的dis[son]的最大值和最小值
如果maxx−minn<=3
dis[u]=minn+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;
}
posted @ 2019-10-22 20:31  loney_s  阅读(111)  评论(0)    收藏  举报