BZOJ 1217 [HNOI2003]消防局的设立

题解:贪心,每次选深度最大的未被覆盖节点,在他的2级祖先处放一个

不会DP做法QWQ

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=100009;

int n;

int ans=0;

int cntedge;
int head[maxn];
int to[maxn<<1],nex[maxn<<1];
void Addedge(int x,int y){
	nex[++cntedge]=head[x];
	to[cntedge]=y;
	head[x]=cntedge;
}

int father[maxn];
int dep[maxn];
int vis[maxn];
void Minit(){
	memset(head,0,sizeof(head));
	memset(dep,0,sizeof(dep));
	memset(father,0,sizeof(father));
	memset(vis,0,sizeof(vis));
	cntedge=0;
}
void Dfs(int now,int fa){
	father[now]=fa;
	dep[now]=dep[fa]+1;
	for(int i=head[now];i;i=nex[i]){
		if(to[i]==fa)continue;
		Dfs(to[i],now);
	}
}
void C(int x,int fa,int d){
	vis[x]=1;
	if(d==0)return;
	for(int i=head[x];i;i=nex[i]){
		if(to[i]==fa)continue;
		C(to[i],x,d-1);
	}
}

int p[maxn];
int cmp(const int &rhs1,const int &rhs2){
	return dep[rhs1]>dep[rhs2];
}

int main(){
	scanf("%d",&n);
	Minit();
	for(int i=2;i<=n;++i){
		int x;scanf("%d",&x);
		Addedge(x,i);
		Addedge(i,x);
	}

	Dfs(1,0);
	for(int i=1;i<=n;++i)p[i]=i;
	sort(p+1,p+1+n,cmp);

	for(int i=1;i<=n;++i){
		if(vis[p[i]])continue;
		++ans;
		if(father[father[p[i]]]==0)break;
		C(father[father[p[i]]],0,2);
	}

	cout<<ans<<endl;
	return 9;
}

  

原文地址:https://www.cnblogs.com/zzyer/p/8454921.html

时间: 2024-10-08 07:45:46

BZOJ 1217 [HNOI2003]消防局的设立的相关文章

bzoj 1217 [HNOI2003]消防局的设立 Label:图论

题目描述 2020年,人类在火星上建立了一个庞大的基地群,总共有n个基地.起初为了节约材料,人类只修建了n-1条道路来连接这些基地,并且每两个基地都能够通过道路到达,所以所有的基地形成了一个巨大的树状结构.如果基地A到基地B至少要经过d条道路的话,我们称基地A到基地B的距离为d. 由于火星上非常干燥,经常引发火灾,人类决定在火星上修建若干个消防局.消防局只能修建在基地里,每个消防局有能力扑灭与它距离不超过2的基地的火灾. 你的任务是计算至少要修建多少个消防局才能够确保火星上所有的基地在发生火灾时

BZOJ1217: [HNOI2003]消防局的设立

1217: [HNOI2003]消防局的设立 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 734  Solved: 405[Submit][Status][Discuss] Description 2020年,人类在火星上建立了一个庞大的基地群,总共有n个基地.起初为了节约材料,人类只修建了n-1条道路来连接这些基地,并且每两个基地都能够通过道路到达,所以所有的基地形成了一个巨大的树状结构.如果基地A到基地B至少要经过d条道路的话,我们称基地A

[luogu]P2279 [HNOI2003]消防局的设立[贪心]

[luogu]P2279 [HNOI2003]消防局的设立 题目描述 2020年,人类在火星上建立了一个庞大的基地群,总共有n个基地.起初为了节约材料,人类只修建了n-1条道路来连接这些基地,并且每两个基地都能够通过道路到达,所以所有的基地形成了一个巨大的树状结构.如果基地A到基地B至少要经过d条道路的话,我们称基地A到基地B的距离为d. 由于火星上非常干燥,经常引发火灾,人类决定在火星上修建若干个消防局.消防局只能修建在基地里,每个消防局有能力扑灭与它距离不超过2的基地的火灾. 你的任务是计算

P2279 [HNOI2003]消防局的设立

P2279 [HNOI2003]消防局的设立考场上想出了贪心策略,但是处理细节时有点问题,gg了.从(当前深度最大的节点)叶子节点往上跳k个,在这里设消防局,并从消防局遍历k个距离,标记上. 1 #include<iostream> 2 #include<cstdio> 3 #include<queue> 4 #include<algorithm> 5 #include<cmath> 6 #include<ctime> 7 #incl

bzoj1217: [HNOI2003]消防局的设立 [树形dp]

Description 2020年,人类在火星上建立了一个庞大的基地群,总共有n个基地.起初为了节约材料,人类只修建了n-1条道路来连接这些基地,并且每两个基地都能够通过道路到达,所以所有的基地形成了一个巨大的树状结构.如果基地A到基地B至少要经过d条道路的话,我们称基地A到基地B的距离为d.由于火星上非常干燥,经常引发火灾,人类决定在火星上修建若干个消防局.消防局只能修建在基地里,每个消防局有能力扑灭与它距离不超过2的基地的火灾.你的任务是计算至少要修建多少个消防局才能够确保火星上所有的基地在

[HNOI2003]消防局的设立

OJ题号:BZOJ1217.洛谷2279 思路:贪心. 先DFS记录各个结点的深度,然后从深度大的结点贪心,如果当前结点不安全,就在它爷爷地方开消防局,同时更新上下二代的安全信息. 1 #include<cstdio> 2 #include<vector> 3 #include<cstring> 4 #include<algorithm> 5 #include<functional> 6 const int N=1001; 7 int p[N];

【贪心】P3942 将军令 &amp;&amp; P2279 消防局的设立

1.消防局的设立 题目描述 2020年,人类在火星上建立了一个庞大的基地群,总共有n个基地.起初为了节约材料,人类只修建了n-1条道路来连接这些基地,并且每两个基地都能够通过道路到达,所以所有的基地形成了一个巨大的树状结构.如果基地A到基地B至少要经过d条道路的话,我们称基地A到基地B的距离为d. 由于火星上非常干燥,经常引发火灾,人类决定在火星上修建若干个消防局.消防局只能修建在基地里,每个消防局有能力扑灭与它距离不超过2的基地的火灾. 你的任务是计算至少要修建多少个消防局才能够确保火星上所有

[HNOI 2003]消防局的设立

Description 2020年,人类在火星上建立了一个庞大的基地群,总共有n个基地.起初为了节约材料,人类只修建了n-1条道路来 连接这些基地,并且每两个基地都能够通过道路到达,所以所有的基地形成了一个巨大的树状结构.如果基地A到 基地B至少要经过d条道路的话,我们称基地A到基地B的距离为d.由于火星上非常干燥,经常引发火灾,人类决定 在火星上修建若干个消防局.消防局只能修建在基地里,每个消防局有能力扑灭与它距离不超过2的基地的火灾. 你的任务是计算至少要修建多少个消防局才能够确保火星上所有

BZOJ 1218: [HNOI2003]激光炸弹( 前缀和 + 枚举 )

虽然source写着dp , 而且很明显dp可以搞...但是数据不大 , 前缀和 + 枚举也水的过去..... ------------------------------------------------------------------------------------------------------- #include<cstdio> #include<cstring> #include<algorithm> #include<iostream&g