P3942 将军令

P3942 将军令

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

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

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

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

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

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

Solution

很早做的题, 那时没博客
今天做了类似的, 貌似数据有点问题。。
好的这题可以贪心
我们从深度大的节点开始, 可以发现在深度与这个节点差 \(\leq k\) 的节点驻扎, 此点可以被控制
那么当然染最远那个点优, 可以够得到上面一点的点
于是从深度大的开始, 若没被染色则上访到最远处, 染色, 顺便将能染得都染了
顺便累计答案即可

Code

#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
#include<algorithm>
typedef long long LL;
using namespace std;
int RD(){
    int out = 0,flag = 1;char c = getchar();
    while(c < '0' || c >'9'){if(c == '-')flag = -1;c = getchar();}
    while(c >= '0' && c <= '9'){out = out * 10 + c - '0';c = getchar();}
    return flag * out;
    }
const int maxn = 1000019,INF = 1e9;
int head[maxn],nume = 1;
struct Node{
    int v,dis,nxt;
    }E[maxn << 3];
void add(int u,int v,int dis){
    E[++nume].nxt = head[u];
    E[nume].v = v;
    E[nume].dis = dis;
    head[u] = nume;
    }
int num,k;
int fa[maxn];
struct T{
    int index,dep;
    }I[maxn];
bool cmp(T a,T b){return a.dep > b.dep;}
bool vis[maxn];
int dep[maxn];
void dfs1(int u,int F){
    for(int i = head[u];i;i = E[i].nxt){
        int v = E[i].v;
        if(v == F)continue;
        I[v].dep = dep[v] = I[u].dep + 1;
        dfs1(v,u);
        }
    }
bool used[maxn];
void dfs2(int u,int left){
    vis[u] = 1;
    used[u] = 1;
    for(int i = head[u];i;i = E[i].nxt){
        int v = E[i].v;
        if(!used[v] && left > 0)dfs2(v,left - 1);
        }
    used[u] = 0;
    }
int col;
void find(int u,int left){
    col = u;
    if(left == 0)return ;
    for(int i = head[u];i;i = E[i].nxt){
        int v = E[i].v;
        if(dep[v] > dep[u])continue;
        find(v,left - 1);
        }
    }
int ans;
void check(){
    for(int i = 1;i <= num;i++){
        if(!vis[I[i].index]){
            ans++;
            find(I[i].index,k);
            dfs2(col,k);
            }
        }
    printf("%d\n",ans);
    }
int main(){
    num = RD();k = RD();RD();
    for(int i = 1;i <= num - 1;i++){
        int u = RD(),v = RD();
        add(u,v,1);add(v,u,1);
        I[i].index = i;//这里和输入路径无关
        }
    I[num].index = num;
    I[1].dep = dep[1] = 1;
    dfs1(1,-1);
    sort(I + 1,I + 1 + num,cmp);
    check();
    return 0;
    }

原文地址:https://www.cnblogs.com/Tony-Double-Sky/p/9813600.html

时间: 2024-08-29 12:15:59

P3942 将军令的相关文章

luogu P3942 将军令

题目背景 pdf题面和大样例链接:http://pan.baidu.com/s/1cawM7c 密码:xgxv 历史/落在/赢家/之手 至少/我们/拥有/传说 谁说/败者/无法/不朽 拳头/只能/让人/低头 念头/却能/让人/抬头 抬头/去看/去爱/去追 你心中的梦 题目描述 又想起了四月. 如果不是省选,大家大概不会这么轻易地分道扬镳吧? 只见一个又一个昔日的队友离开了机房. 凭君莫话封侯事,一将功成万骨枯. 梦里,小 F 成了一个给将军送密信的信使. 现在,有两封关乎国家生死的密信需要送到前

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

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

将军令 Luogu P3942

pdf题面和大样例链接:http://pan.baidu.com/s/1cawM7c 密码:xgxv 历史/落在/赢家/之手 至少/我们/拥有/传说 谁说/败者/无法/不朽 拳头/只能/让人/低头 念头/却能/让人/抬头 抬头/去看/去爱/去追 你心中的梦 将军令 题目描述 又想起了四月. 如果不是省选,大家大概不会这么轻易地分道扬镳吧? 只见一个又一个昔日的队友离开了机房. 凭君莫话封侯事,一将功成万骨枯. 梦里,小 F 成了一个给将军送密信的信使. 现在,有两封关乎国家生死的密信需要送到前线

【转载】网易将军令工作原理

最近开始玩梦幻手游,为了领以前端游的返利必须输入将军令,那个已经一年没用了,输入了几次都提示错误(后来证实是系统繁忙而已),我以为是将军令时间不对了,所以用了下官网的修复功能.也对将军令修复原理有了兴趣,故搜了如下文,非常详细的讲了对将军令原理的猜测,感觉十有八九是对的,看完了觉得非常简单的一个功能,让我自己想一时还想不到. 整理的几个关键点: 1.用固定序号确保产出码的唯一性,用时间确保动态性 2.将军令本身的时间准确度是基础,比如在1星期内误差别超过1个小时我感觉就能接受(主要看矫正机制)

P3942

题目传送P3942 思路 是P2279消防局的设立的加强版 我们只需要每次找到最深的点,然后找到向上距离他 $k$ 个深度的祖先 话说只要在之前的代码改几个地方就行 可我偏偏调了一晚上 数据到了1e5 到大数据就莫名死循环 改了下 还是TLE TLE的原因 是每次把选中点距离为 $k$ 的点标记,要记录前一个点,而不能直接用它的父亲,因为并不准确,我们可能向下走也可能向上走,上一个走过来的不一定是父亲.需要单独记录. 死循化 的原因好像是弹出队列时死循环了 代码 #include<iostrea

noip模拟赛 将军令

分析:对于前18个点可以考虑非常恶心的树形dp,不推荐这种方法.其实贪心还是很显然的.每个小队可以控制距离不超过k里的驿站,肯定要让这个k里不能白白浪费.对于所有叶子节点,如果它还没有被控制,那么肯定要在它的第k级祖先派一个小队.这样能保证控制到它,还能控制到尽可能多的点.这样,将所有点按照深度排序,从深度最深的点里面找没有被控制到的,找到它的第k级祖先,然后dfs暴力覆盖. Qusetion:为什么不从深度最浅的点找? 每个子节点只有一个祖先,而每个祖先可能会有多个子节点,不知道在哪里派小队最

luogu3942将军令

https://www.zybuluo.com/ysner/note/1302132 题面 在大小为\(n\)的树上选择尽量少的点,使得所有未选择的点距离选择了的点小于等于\(k\). \(n\leq10^5,k\leq20\) 解析 令\(k\)为正整数. 设\(k+1\)为距离最近的,选择了的点,还能向上覆盖的距离为\(k\).这类标记称为\(A\). 设\(-k-1\)为距离最近的,选择了的点,的覆盖范围为\(k\).这类标记陈伟 (\(+1\).\(-1\)主要是为了避免\(0\)的两重

将军令(贪心&amp;&amp;树形DP)

只看45分的话,是树形DP....(当然也有能拿到70分+的大佬) 40分: 只考虑k==1的情况,树形DP 所以每个节点可能被父亲,自己,儿子控制 设f[MAXN][3],0表示儿子,1表示自己,2表示父亲 f[i][1]+=min(f[to][0],f[to][1],f[to][2])(因为自己控制自己,儿子怎样都行) f[i][0]+=min(f[to][0],f[to][1]) 但是因为i的儿子必须有一个自己控制自己,所以还要判断所加值中是否有f[to][1],如果没有 f[i][0]+

苹果iOS系统下检查第三方APP是否安装及跳转启动

\ 在iOS系统,使用Url Scheme框架在APP间互相跳转和传递数据,本文只介绍如果检测和跳转. Url Scheme框架 如果你想知道ios设备中是否安装QQ这个软件,我们可以通过一个简单方法判断到: if ([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"mqq://"]]) { NSLog(@"install--"); } else { NSLog(@"n