zoukankan      html  css  js  c++  java
  • 洛谷P3942 将军令

    题目链接

    传送门

    solution

    • 苟利国家生死以,岂因祸福避趋之!
    • 可以想到,对于每一个深度最深且没被覆盖的节点,选择他的\(k\)级父亲覆盖他一定最优,因为这样选择可以覆盖到尽量多的人,这个贪心还是比较显然的
    • 简单个p啊,考场上被被\(k\)的范围迷惑打了2个小时树形DP的是谁啊
    • 可以开一个堆维护所有未覆盖节点中深度最大的,每次弹出队首,若队首未被覆盖,则找到他的\(k\)级父亲,并记录新覆盖到的节点即可

    code

    #include<bits/stdc++.h>
    using namespace std;
    inline int read(){
    	int x=0,f=1;char ch=getchar();
    	while(!isdigit(ch)){if(ch=='-') f=-1;ch=getchar();}
    	while(isdigit(ch)){x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
    	return x*f;
    }
    const int N=1e5+10;
    #define mp make_pair
    priority_queue<pair<int,int> >pq;
    struct node{
    	int v,nxt;
    }e[N<<1];
    int n,k,t,first[N],cnt,dep[N],fa[N],vis[N];
    inline void add(int u,int v){e[++cnt].v=v;e[cnt].nxt=first[u];first[u]=cnt;}
    inline void dfs_init(int u,int f){
    	for(int i=first[u];i;i=e[i].nxt){
    		int v=e[i].v;
    		if(v==f) continue;
    		dep[v]=dep[u]+1;fa[v]=u;
    		dfs_init(v,u);
    	}
    }
    inline void expand(int u,int f,int d){
    	vis[u]=1;
    	if(d==k) return ;
    	for(int i=first[u];i;i=e[i].nxt){
    		int v=e[i].v;
    		if(v!=f) expand(v,u,d+1);
    	}
    }
    int main(){
    	n=read();k=read();t=read();
    	for(int i=1;i<n;++i){
    		int u=read(),v=read();
    		add(u,v);add(v,u);
    	}
    	dep[1]=1;
    	dfs_init(1,0);
    	for(int i=1;i<=n;++i) pq.push(mp(dep[i],i));
    	int ans=0;
    	while(!pq.empty()){
    		int u=pq.top().second;pq.pop();
    		if(vis[u]) continue;
    		for(int i=1;i<=k;++i){
    			if(fa[u]==0) break;
    			u=fa[u];
    		}
    		ans++;
    		expand(u,0,0);
    	}
    	printf("%d\n",ans);
    	return 0;
    }
    
  • 相关阅读:
    Numpy
    啊大大阿达
    asda
    啊大大
    初识python
    初识python
    初识python
    初识python
    初识python
    初识python
  • 原文地址:https://www.cnblogs.com/tqxboomzero/p/13836976.html
Copyright © 2011-2022 走看看