文章目录

  • 题目
    • 题目描述
    • 输入
    • 输出
    • 样例
  • 题意
  • 思路
  • 代码

洛谷题目链接
WOJ题目链接

题目

洛谷[USACO18JAN] P4186 Cow at Large G
WOJ#3562 atlarge

题目描述

最后,Bessie被迫去了一个远方的农场。这个农场包含N个谷仓(2 <= N <= 105)和N-1条连接两个谷仓的双向隧道,所以每两个谷仓之间都有唯一的路径。每个只与一条隧道相连的谷仓都是农场的出口。当早晨来临的时候,Bessie将在某个谷仓露面,然后试图到达一个出口。
但当Bessie露面的时候,她的位置就会暴露。一些农民在那时将从不同的出口谷仓出发尝试抓住Bessie。农民和Bessie的移动速度相同(在每个单位时间内,每个农民都可以从一个谷仓移动到相邻的一个谷仓,同时Bessie也可以这么做)。农民们和Bessie总是知道对方在哪里。如果在任意时刻,某个农民和Bessie处于同一个谷仓或在穿过同一个隧道,农民就可以抓住Bessie。反过来,如果Bessie在农民们抓住她之前到达一个出口谷仓,Bessie就可以逃走。
Bessie不确定她成功的机会,这取决于被雇佣的农民的数量。给定Bessie露面的谷仓K,帮助Bessie确定为了抓住她所需要的农民的最小数量。假定农民们会自己选择最佳的方案来安排他们出发的出口谷仓。

输入

输入的第一行包含N和K。接下来的N – 1行,每行有两个整数(在1~N范围内)描述连接两个谷仓的一条隧道。

输出

输出为了确保抓住Bessie所需的农民的最小数量。

样例

  • 输入样例
    7 1
    1 2
    1 3
    3 4
    3 5
    4 6
    5 7
  • 输出样例
    3

题意

给定一棵有根树。贝茜从根节点出发,出口是每个叶子节点,可以在每个出口放一个农民,每1个单位时间内,贝茜和农民都可以移动到相邻的一个点,如果某一时刻农民与贝茜相遇了(在边上或点上均算),则贝茜将被抓住。求为了保证抓住贝茜,最少需要几个农民。

思路

首先明确一点:每个农民,每次都移动到自己的父亲节点,显然是最优的。
然后考虑最坏的情况:这棵树只有两层(如下图)。
因为懒得画图所以就拿mermaid将就一下啦凑合着看吧。

root
1
2
3
4
...

此时为了满足条件,我们需要在每一个叶子节点,都放一个农民。
然后考虑优化:当节点iii到根节点的距离,大于它到以iii为根的叶子结点jjj的距离时,以iii为根的子树,就只需要安放一个jjj节点就够了(如下图)。

root
1
2
...
i
j

所以我们预处理出了iii的子树上距iii最近的叶子节点jjj到iii的最短距离,存储在last[i]last[i]last[i]中,将节点iii的深度存储在dep[i]dep[i]dep[i]中。然后遍历,如果last[i]&lt;=dep[i]last[i]&lt;=dep[i]last[i]<=dep[i],则iii的子树均可以用这一个守卫守住,否则要去下面用更多的守卫(ans++ans++ans++)。算一下答案即可。

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=1e5+10;
int n,m,root,cnt=2,ans=0;
int first[maxn],dep[maxn],last[maxn],fa[maxn];
struct edge {int u,v,nxt;};
edge e[maxn<<1];
inline int read()
{int x=0,f=1;char c;for(c=getchar();(c<'0'||c>'9')&&c!='-';c=getchar());if(c=='-') {f=-1;c=getchar();}while(c>='0'&&c<='9') {x=(x<<3)+(x<<1)+c-'0';c=getchar();}return x*f;
}
inline void add(int u,int v)
{e[cnt].u=u;e[cnt].v=v;e[cnt].nxt=first[u];first[u]=cnt++;
}
void dfs(int x)
{int son=0;for(int i=first[x];i;i=e[i].nxt){int v=e[i].v;if(v==fa[x]) continue;son++;fa[v]=x;dep[v]=dep[x]+1;dfs(v);last[x]=min(last[x],last[v]+1);}if(!son)last[x]=0;
}
void solve(int x)
{if(last[x]<=dep[x]) {ans++;return;}for(int i=first[x];i;i=e[i].nxt){int v=e[i].v;if(v==fa[x]) continue;solve(v);}
}
int main()
{memset(last,0x3f,sizeof(last));n=read(),root=read();for(int i=1;i<n;i++){int u=read(),v=read();add(u,v);add(v,u);}dfs(root);solve(root);cout<<ans;return 0;
}

图论·并查集·题解【Cow at Large G·atlarge】相关推荐

  1. 图论 + 并查集 ----最小生成树重构图 + 可撤销并查集 + set启发式合并 时间线上的离线求解 D. Graph and Queries

    解题思路 题目大意: 就是给你一个无向图,每个点都有一个权值,和qqq次询问 每次询问有两种操作 1 x:就询问从x点出发,能访问到的最大权值是多少,并把最大权值那个点的权值设置为0 2 x:就是删除 ...

  2. [kuangbin带你飞]专题五 并查集 题解+总结

    kuangbin带你飞:点击进入新世界 总结: 本人算是初学者中的初学者,欢迎交流~ 并查集的接触过的不多,大概只有普通并查集,带权并查集,种族并查集,传说中的可持续化并查集只是听说过还没有接触,不过 ...

  3. 牛客小白月赛25 C-白魔法师 ( 图论 + 并查集 )

    题目链接 解题报告: 思路:如果将一个黑色点染成白色,那么将得到一个白色连通块,这个连通块由和这个黑色点连结的所有白色连通块组成. 如果将一个白色点染成白色,那么不会有任何变化. 所以我们可以先并查集 ...

  4. [USACO18JAN] Cow at Large G (dfs)

    题目大意:有一只狐狸从给定的S点开始逃跑(出发),向叶节点移动以逃离这棵树,叶节点可能出现农民去抓捕狐狸,当农民和狐狸出现在同一个节点的时候,狐狸会被抓住,农民和狐狸移动速度相同,求抓捕狐狸所需要的最 ...

  5. 【总结】C++ 高级数据结构 —— 并查集用法详解

    文章目录 一.并查集的介绍 二.并查集的基本操作 一.并查集的介绍 并查集(union_find sets)是一种维护集合的数据结构,它的名字中"并""查"&q ...

  6. 图论:并查集求最小环

    图论:并查集求最小环 概念: 图.路.环: 一个有向图由G=(N,A)表示,其中N表示节点集,A表示边集边(i,j)为一有序对,i为出发节点,j为终止节点.在无向图中(i,j)与(j,i)一致. 路是 ...

  7. BZOJ 1604 [Usaco2008 Open]Cow Neighborhoods 奶牛的邻居:队列 + multiset + 并查集【曼哈顿距离变形】...

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1604 题意: 平面直角坐标系中,有n个点(n <= 100000,坐标范围10^9) ...

  8. 证明kruskal算法求解图的最小生成树具有贪心选择性质_将并查集应用在图论中的最小生成树算法——Kruskal...

    点击上方蓝字,和我一起学技术. 今天是算法和数据结构专题的第19篇文章,我们一起来看看最小生成树. 我们先不讲算法的原理,也不讲一些七七八八的概念,因为对于初学者来说,看到这些术语和概念往往会很头疼. ...

  9. bzoj4144 [AMPPZ2014]Petrol 图论 最短路 并查集

    bzoj4144 [AMPPZ2014]Petrol 图论 最短路 并查集 1.这道题我们主要就是要求出距离一个油站的最近的油站 首先我们dijkstra 求出任意一个点到 离他最近的油站的距离 2. ...

  10. ssl2348-连接格点【图论,最小生成树,并查集】

    题目 有一个M行N列的点阵,相邻两点可以相连.一条纵向的连线花费一个单位,一条横向的连线花费两个单位.某些点之间已经有连线了,试问至少还需要花费多少个单位才能使所有的点全部连通. 输入 第一行输入两个 ...

最新文章

  1. Custom Client Side Drag and Drop Behavior in ASP.NET AJAX
  2. 导入Excel表里的数据时产生【定义了过多字段】,但有时又是成功的
  3. python3常用模块_Python3 常用模块
  4. android小游戏模版—重力感应
  5. 2018-05-04 http入门
  6. matlab uicontrol 下标,Matlab Impoint和Uicontrol
  7. OCR文字识别算法总结
  8. 企业信息安全————3、如何建立企业安全框架
  9. java 7zip分卷压缩_7zip分卷压缩,rar分卷压缩文件
  10. 2020双十一,阿里云GRTN拉开直播和RTC技术下半场的序幕
  11. 盘点电脑系统变慢七大原因
  12. 前端项目实战145-React.Fragment
  13. [生存志] 第89节 太公阴符天人之道
  14. 关于基础微积分的结束语
  15. signature=cfd49330e04062ab770d7ddb4cfcf23a,Przed pierwszym rozbiorem Polski
  16. 转载:Unofficial Windows Binaries for Python Extension Packages
  17. 通过js控制layui选择框checkbox的选中、取消选中,以及使用layui实现全选、取消全选的一种方式
  18. 零基础!!最全计算机三级网络技术备考指南!!
  19. 物业管理系统 ERP系统 下载
  20. 组合人民币问题(存在问题)

热门文章

  1. python海龟绘图颜色_Python:海龟绘图(六)——来点颜色看看
  2. 计算机键盘优点,市面上的笔记本键盘优缺点解析,看完秒懂!
  3. 记一次蓝牙音箱无声音的原因
  4. Deepin、统信UOS等Linux系统连接Windows网络邻居的共享文件夹的方法
  5. matlab三维绘图
  6. python编写安装脚本_ido-Python 安装脚本包
  7. 同程内网流传的分布式凤凰缓存系统手册,竟遭GitHub强行开源下载
  8. 如何管理好技术团队的十六点建议
  9. 清华计算机系分数线2018四川,四川多少分能上清华?附清华大学在四川的录取分数线...
  10. 等了6年,周杰伦最新专辑来了!5天破2600万!