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

    题目背景

    pdf题面和大样例链接:http://pan.baidu.com/s/1cawM7c 密码:xgxv

     历史/落在/赢家/之手 
     至少/我们/拥有/传说 
     谁说/败者/无法/不朽 
     拳头/只能/让人/低头 
     念头/却能/让人/抬头 
     抬头/去看/去爱/去追 
     你心中的梦   

    题目描述

    又想起了四月。

    如果不是省选,大家大概不会这么轻易地分道扬镳吧? 只见一个又一个昔日的队友离开了机房。

    凭君莫话封侯事,一将功成万骨枯。

    梦里,小 F 成了一个给将军送密信的信使。

    现在,有两封关乎国家生死的密信需要送到前线大将军帐下,路途凶险,时间紧迫。小 F 不因为自己的祸福而避趋之,勇敢地承担了这个任务。

    不过,小 F 实在是太粗心了,他一不小心把两封密信中的一封给弄掉了。

    小 F 偷偷打开了剩下的那封密信。他 发现一副十分详细的地图,以及几句批文——原来 这是战场周围的情报地图。他仔细看后发现,在这张地图上标记了 n 个从 1 到 n 标号的 驿站,n − 1 条长度为 1 里的小道,每条小道双向连接两个不同的驿站,并且驿站之间可以 通过小道两两可达。

    小 F 仔细辨认着上面的批注,突然明白了丢失的信的内容了。原来,每个驿站都可以驻 扎一个小队,每个小队可以控制距离不超过 k 里的驿站。如果有驿站没被控制,就容易产 生危险——因此这种情况应该完全避免。而那封丢失的密信里,就装着朝廷数学重臣留下的 精妙的排布方案,也就是用了最少的小队来控制所有驿站。

    小 F 知道,如果能计算出最优方案的话,也许他就能够将功赎过,免于死罪。他找到了 你,你能帮帮他吗? 当然,小 F 在等待你的支援的过程中,也许已经从图上观察出了一些可能会比较有用的 性质,他会通过一种特殊的方式告诉你。

    输入输出格式

    输入格式:

     

    从标准输入中读入数据。

    输入第 1 行一个正整数 n,k,t,代表驿站数,一支小队能够控制的最远距离,以及特 殊性质所代表的编号。关于特殊性质请参照数据范围。

    输入第 2 行至第 n 行,每行两个正整数 u_iui,v_ivi,表示在 u_iui 和 v_ivi 间,有一条长度为 一里的小道。

     

    输出格式:

     

    输出到标准输出中。

    输出一行,为最优方案下需要的小队数。

     

    输入输出样例

    输入样例#1: 复制
    4 1 0 
    1 2 
    1 3 
    1 4
    输出样例#1: 复制
    1 
     
     
     
    输入样例#2: 复制
    6 1 0 
    1 2 
    1 3 
    1 4 
    4 5 
    4 6
    输出样例#2: 复制
    2 
    

     

     

     

     

     

    说明

    【样例 1 说明】

    如图。由于一号节点到周围的点距离均是 1,因此可以控制所有驿站。

    【样例 2 说明】

    如图,和样例 1 类似。

    子任务会给出部分测试数据的特点。如果你在解决题目中遇到了困难,可以尝试只解 决一部分测试数据。

    关于 t 的含义如下: t = 0:该测试点没有额外的特殊性质; t = 1:保证最多 8 个点的所连接的小道超过 1 条; t = 2:保证所有点到 1 号点的距离不超过 2。

    每个测试点的数据规模及特点如下表

    题目链接:https://www.luogu.org/problemnew/show/P3942#sub

    解题报告:

    低配版消防局

    bfs+dfs+贪心

    从最深处开始贪心,将其k祖先作为驿站,进行dfs

    #include<cstdio>
    #include<queue>
    #include<algorithm>
    #include<iostream>
    #define BIG 2000011
    #define ll long long
    #define FOR(i,s,t) for(register int i=s;i<=t;++i)
    using namespace std;
    int nxt[BIG],las[BIG>>1],to[BIG],a[BIG>>1],dep[BIG>>1],fa[BIG>>1],vis[BIG>>1];
    int n,k,t,f;
    int x,y,ans,tot;
    inline void add(int x,int y){
    	nxt[++tot]=las[x];las[x]=tot;to[tot]=y;
    }
    #define VIS(now) for(register int e=las[now];e;e=nxt[e])
    inline void bfs(int x){
    	queue<int>q;
    	dep[x]=1;
    	fa[1]=1;
    	q.push(x);
    	int now;
    	while(!q.empty()){
    		now=q.front();
    		q.pop();
    		VIS(now)
    			if(!dep[to[e]])
    				fa[to[e]]=now,dep[to[e]]=dep[now]+1,q.push(to[e]);
    	}
    }
    inline bool cmp(int a,int b){
    	return dep[a]>dep[b];
    }
    inline int up(int x){
    	int cnt=0;
    	while(cnt<k){
    		x=fa[x];
    		++cnt;
    	}
    	return x;
    }
    inline void dfs(int now,int fa,int tot){
    	vis[now]=1;
    	if(tot==k)
    		return;
    	VIS(now)
    		if(to[e]!=fa)
    			dfs(to[e],now,tot+1);
    }
    int main(){
    	scanf("%d%d%d",&n,&k,&t);
    	FOR(i,2,n){
    		scanf("%d%d",&x,&y);
    		add(x,y);
    		add(y,x);
    	}
    	bfs(1);
    	FOR(i,1,n)
    		a[i]=i;
    	sort(a+1,a+n+1,cmp);
    	FOR(i,1,n)
    		if(!vis[a[i]]){
    			++ans;		
    			f=up(a[i]);
    			dfs(f,f,0);
    		}
    	printf("%d
    ",ans);
    	return 0;
    }
    

      

  • 相关阅读:
    停滞的代码
    民兵葛二蛋大结局
    该开始BS了
    今天写出了第一个.NetBS应用
    读源码,仿照
    MVN,老天怎么回事?
    从哪里入手
    学习Java了
    工厂方法模式与简单工厂
    转:悟透JavaScript
  • 原文地址:https://www.cnblogs.com/Stump/p/7780557.html
Copyright © 2011-2022 走看看