农夫约翰的奶牛住在N (2 <= N <= 200,000)片不同的草地上,标号为1到N。恰好有N-1条单位长度的双向道路,用各种各样的方法连接这些草地。而且从每片草地出发都可以抵达其他所有草地。也就是说,这些草地和道路构成了一种叫做树的图。输入包含一个详细的草地的集合,详细说明了每个草地的父节点P_i (0 <= P_i <= N)。根节点的P_i == 0, 表示它没有父节点。因为奶牛建立了1到K一共K (1 <= K <= N/2)个政党。每只奶牛都要加入某一个政党,其中, 第i只奶牛属于第A_i (1 <= A_i <= K)个政党。而且每个政党至少有两只奶牛。 这些政党互相吵闹争。每个政党都想知道自己的“范围”有多大。其中,定义一个政党的范围是这个政党离得最远的两只奶牛(沿着双向道路行走)的距离。
输入输出格式
输入格式:
* Line 1: Two space-separated integers: N and K
* Lines 2..N+1: Line i+1 contains two space-separated integers: A_i and P_i
输出格式:
* Lines 1..K: Line i contains a single integer that is the range of party i.
输入输出样例
输入样例#1:
6 2
1 3
2 1
1 0
2 1
2 1
1 5
输出样例#1:
3
2 

题面

首先需要知道在只有一个政党的情况下,

题目弱化为求一个树中最远的两个点的距离,这个是可以用两遍BFS的方法求出,

具体步骤为:
随便选择一个节点x,BFS求出距离x最远的节点y(有相同的随便选)。
以节点y为起点,BFS求出距离y最远的节点z(有相同的随便选)。
节点y和节点z之间的距离,就是这棵树中最远距离。
有了上面这个之后,在本题中,我们对每个政党都做一遍这个方法即可,

但是我们不能进行BFS了。注意到BFS只是为了求距离最远的点,

那么如果我们可以通过其他方法来求得任意两点间距离的话,步骤就可以转变为:
随便选择该政党的一个节点x,枚举该政党的其他节点,求出距离x最远的节点y。
以节点y为起点,枚举该政党的其他节点,求出距离y最远的节点z。
节点y和节点z的距离,就是该政党的最远距离。
对于求树上任意两点间的距离,一般转化为求LCA的,即
Dist(x, y) = Depth(x) + Depth(y) - 2 * Depth(LCA(x, y))
求LCA的方法有很多,这里就不再描述了。

#include<bits/stdc++.h>
using namespace std;
const int N=2e5+20;
int h[N],n,tot,k;
struct node{int v,ne;
}e[N];
void add(int u,int v)
{tot++;e[tot]=(node){v,h[u]};h[u]=tot;
}
int rt,f[N][30],d[N];
vector<int>bg[N/2];
void dfs(int x)
{for(int i=h[x];i;i=e[i].ne){int rr=e[i].v;d[rr]=d[x]+1;dfs(rr);}
}
int lca(int x,int y)
{if(d[x]<d[y]) swap(x,y);int h=d[x]-d[y];for(int j=27;j>=0;--j)if((1<<j)&h) x=f[x][j];for(int j=27;j>=0;--j)if(f[x][j]!=f[y][j]) x=f[x][j],y=f[y][j];if(x==y) return x;else return f[x][0];
}
int main()
{scanf("%d%d",&n,&k);for(int i=1,x,y;i<=n;++i){scanf("%d%d",&x,&y);bg[x].push_back(i);if(y) add(y,i),f[i][0]=y;else rt=i;}d[rt]=1;dfs(rt);for(int j=1;j<=27;++j)for(int i=1;i<=n;++i)f[i][j]=f[f[i][j-1]][j-1];for(int i=1,x,y,z,dis;i<=k;++i){x=bg[i][0];y=0;for(int j=1;j<bg[i].size();++j){dis=d[bg[i][j]]+d[x]-2*d[lca(bg[i][j],x)];if(dis>y) y=dis,z=bg[i][j];}y=0;for(int j=0;j<bg[i].size();++j){dis=d[bg[i][j]]+d[z]-2*d[lca(bg[i][j],z)];if(dis>y) y=dis,x=bg[i][j];}printf("%d\n",y);}return 0;
}

代码

转载于:https://www.cnblogs.com/adelalove/p/9135521.html

[USACO10HOL]牛的政治Cow Politics相关推荐

  1. P3033 [USACO11NOV]牛的障碍Cow Steeplechase

    P3033 [USACO11NOV]牛的障碍Cow Steeplechase 题目描述 详见:P3033 [USACO11NOV]牛的障碍Cow Steeplechase solution 裸题. 对 ...

  2. 题解 洛谷 P3069 [USACO13JAN]牛的阵容Cow Lineup

    洛谷P3069[USACO13JAN]牛的阵容CowLineup\color{#00F}{洛谷\ P3069\ [USACO13JAN]牛的阵容Cow Lineup}洛谷 P3069 [USACO13 ...

  3. 信息学奥赛一本通 1343:【例4-2】牛的旅行 | 洛谷 P1522 [USACO2.4] 牛的旅行 Cow Tours

    [题目链接] ybt 1343:[例4-2]牛的旅行 洛谷 P1522 [USACO2.4] 牛的旅行 Cow Tours [题目考点] 1. 图论 最短路径 Floyd算法 Floyd算法时间复杂度 ...

  4. 脏牛(Dirty COW)漏洞攻击实验(SEED-Lab:Dirty-COW Attack Lab)

    <脏牛(Dirty COW)漏洞攻击实验> 目录 <脏牛(Dirty COW)漏洞攻击实验> **一:实验目的** **二:实验步骤与结果** **漏洞原理:** **COW机 ...

  5. 【USACO10HOL】 Cow Politics

    题目大意 给出k组点,求出组内两点间的最大距离 核心思路 考虑贪心,每组内的最深一点一定是两最远距离点对之一. 证明很简单,可以分为在该点的祖先相同和祖先不同的情况.如果点对其中一个为另一个的祖先的话 ...

  6. 洛谷 3029 [USACO11NOV]牛的阵容Cow Lineup

    https://www.luogu.org/problem/show?pid=3029 题目描述 Farmer John has hired a professional photographer t ...

  7. 洛谷 P1821 [USACO07FEB]银牛派对Silver Cow Party

    题目描述 One cow from each of N farms (1 ≤ N ≤ 1000) conveniently numbered 1..N is going to attend the b ...

  8. 洛谷P1821 [USACO07FEB]银牛派对Silver Cow Party

    题目描述 One cow from each of N farms (1 ≤ N ≤ 1000) conveniently numbered 1..N is going to attend the b ...

  9. C++广度优先搜索算法之抓住那头牛(Catch that cow)

    抓住那头牛: 农夫知道一头牛的位置,想要抓住它.农夫和牛都位于数轴上,农夫起始位于点N(0<=N<=100000),牛位于点K(0<=K<=100000).农夫有两种移动方式: ...

  10. 【洛谷 1821】银牛派对Silver Cow Party

    题目描述 One cow from each of N farms (1 ≤ N ≤ 1000) conveniently numbered 1..N is going to attend the b ...

最新文章

  1. 万能头文件#include<bits/stdc++.h>更新GCC10.2.0版本
  2. 微软出面解释Win11各种大bug,引发网友一顿嘲讽:都是祖传手艺
  3. Spring Boot整合 Sentry 监控项目日志
  4. Exchange Server 2016管理系列课件33.通讯组仲裁
  5. 【工具】模板引擎 Velocity
  6. 前段react技术架构图_基于 React 的可视化编辑平台实践
  7. getprofile()获取不到路径_做一款RPG游戏,几乎都会用到的Python坐标最短路径计算...
  8. 题目 2055: 等待戈多(最短路)
  9. 搬货物(51Nod-1596)
  10. 每日算法系列【LeetCode 123】买卖股票的最佳时机 III
  11. mysql里判断_mysql里如何使用判断语句?
  12. RJ45网线水晶头线序,568A与568B区别,交叉线与直连线区别,10/100M base TX RJ45 接口引脚功能定义
  13. 前端基础之HTML5音视频标签(video/audio)讲解
  14. 中兴ZXDSL831驱动
  15. 抖音小店保证金被扣除怎么办?抖音小店货款什么时候结算?
  16. 节奏旋律音乐制作软件-Native Instruments Maschine 2 v2.14.1 WiN
  17. 用 Python 让 Excel 快速按条件筛选数据
  18. 什么是 IoT App SDK?
  19. c语言switch函数的作用,c语言的switchcase语句
  20. 一个作业题---用python创建一个通讯录

热门文章

  1. 软件License设计思路与实现方案
  2. php 联合查询,多表联合查询
  3. JAVA编程入门学习
  4. 92.发光文字加载特效
  5. 花1分钟用Word手动绘制流程图,看完我学会了!
  6. 【OpenGL】FBO渲染到纹理案例
  7. 财富、通胀与印钞——读《原则2 :应对变化中的世界秩序》(上)
  8. c++ 函数后面加一个冒号的含义
  9. 最全HTTP协议详解
  10. 沥青路面粘弹性力学分析基础研究