FZU 2207 ——以撒的结合——————【LCA + 记录祖先】
Accept: 47 Submit: 161
Time Limit: 1000 mSec Memory Limit : 32768 KB
Problem Description
小茗同学最近在认真地准备比赛,所以经常玩以撒的结合。
《以撒的结合》是一款由Edmund McMillen,Florian Himsl 开发,并由Edmund McMillen最早于2011年09月29日发行的一款2D平面角色扮演、动作冒险类的独立游戏。游戏的角色将在有着能够提升能力的道具与特殊技能的半RPG世界中闯荡。
——来自百度百科
小茗同学在打BOSS前,费掉了很多HP。在地图的一些房间里有补充HP的红心,然而小茗同学受到了看不见地图的诅咒。凭借不知道哪里来的记忆,小茗同学记得某个有红心的房间在房间A与房间B的路上的第K个房间里。为了简化问题,我们把地图看成一棵树。小茗同学想知道A到B的第K个房间号为多少,由于小茗同学很累,所以现在这个任务交给你了。
Input
第一行是一个整数T(T<=10),表示有T组测试数据。
每组数据的第一行为两个整数n m(0<n<=1000,0<m<=n*n),分别表示房间个数和询问次数。
接下来n-1行,每行两个整数u v(0<u、v<=n,且u≠v),表示地图上房间u和房间v有一条路径。
最后是m行,每行三个整数u v k,表示询问房间u到房间v的路径上的第k个房间。
输入数据保证合法,即k不超过u、v的最短距离。
Output
对于每组数据,首先第一行先输出“Case #x:“ ,其中x是从1开始,表示数据组号,接下来m行,每行输出相应的房间号。
Sample Input
Sample Output
Source
FOJ有奖月赛-2015年11月
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<vector>
#include<math.h>
#include<map>
#include<set>
#include<queue>
#include<stack>
#include<string>
#include<stdlib.h>
#include<algorithm>
using namespace std;
typedef long long LL;
#define mid (L+R)/2
#define lson rt*2,L,mid
#define rson rt*2+1,mid+1,R
const int maxn = 1300;
const LL mod = 1000000007;
const int INF = 0x3f3f3f3f;
struct AdjEdge{int to,w,next;
}adjedges[maxn*2];
int head[maxn];
int vset[maxn*2],dep[maxn],d[maxn*2][30],first[maxn];
int fa[maxn][maxn];
int tot,nn;
void init(){tot=0;nn=0;memset(dep,0,sizeof(dep));memset(head,-1,sizeof(head));memset(d,0,sizeof(d));memset(first,0,sizeof(first));
}
void addedge(int _u,int _v){ //adjedges[tot].to=_v;adjedges[tot].next=head[_u];head[_u]=tot++;
// adjedges[tot].to=_u;
// adjedges[tot].next=head[_v];
// head[_v]=tot++;
}void dfs(int _u,int _fa,int _dep){// printf("%d %d\n",_u,_dep);dep[_u]=_dep;vset[++nn]=_u;first[_u]=nn;fa[_u][0] = _u;for(int i = 1; i <= _dep; i++){fa[_u][i] = fa[_fa][i-1];}for(int i=head[_u];i!=-1;i=adjedges[i].next){AdjEdge & e = adjedges[i];if(e.to!=_fa){dfs(e.to,_u,_dep+1);vset[++nn]=_u;}}
}
void ST(){for(int i=1;i<=nn;i++)d[i][0]=vset[i];for(int j=1; (1<<j)<=nn; j++){for(int i=1; i+(1<<j)-1<=nn; i++){if(dep[d[i][j-1]]<dep[d[i+(1<<(j-1))][j-1]])d[i][j]=d[i][j-1];else d[i][j]=d[i+(1 << (j-1))][j-1];}}
}int RMQ(int L,int R){int k=0;while((1<<(k+1))<=R-L+1) k++;if(dep[d[L][k]]<=dep[d[R-(1<<k)+1][k]])return d[L][k];return d[R-(1<<k)+1][k];
}
void tes(){for(int i =1; i <= 7; i++){for(int j = 0; j <= 4; j++){printf("%d ",fa[i][j]);}puts("");}
}
int main(){int T, n, q, cas = 0;scanf("%d",&T);while(T--){init();int a,b,k;scanf("%d%d",&n,&q);for(int i=1; i<n; i++){scanf("%d%d",&a,&b);addedge(a,b);addedge(b,a);}memset(fa,0,sizeof(fa));dfs(1,0,1); //dep 1ST();// tes();printf("Case #%d:\n",++cas);int x;for(int i=0; i<q; i++){scanf("%d%d%d",&a,&b,&k);if(first[a]<=first[b]){x = RMQ(first[a],first[b]);}else{x = RMQ(first[b],first[a]);}if(k == 1){printf("%d\n",a);}else if(dep[a] + dep[b] - 2*dep[x] + 1 == k){printf("%d\n",b);}else if(dep[a] - dep[x] + 1 >= k){printf("%d\n",fa[a][k-1]);}else{int kk = dep[a] + dep[b] - 2*dep[x] - k + 1;printf("%d\n",fa[b][kk]);}}}return 0;
}/*
55
7 10
1 2
1 3
2 4
2 5
5 6
5 74 3 3
4 3 2
7 4 3
4 7 3
4 7 4*/
转载于:https://www.cnblogs.com/chengsheng/p/5288003.html
FZU 2207 ——以撒的结合——————【LCA + 记录祖先】相关推荐
- FZU 2207 以撒的结合(LCA+记录路径)
Problem Description 小茗同学最近在认真地准备比赛,所以经常玩以撒的结合. <以撒的结合>是一款由Edmund McMillen,Florian Himsl 开发,并由E ...
- Fzu 2207 以撒的结合【思维+Dfs序】好题!好题!
Problem 2207 以撒的结合 Accept: 68 Submit: 219 Time Limit: 1000 mSec Memory Limit : 32768 KB Prob ...
- 福州大学acm Problem 2207 以撒的结合
Problem 2207 以撒的结合 Accept: 72 Submit: 239 Time Limit: 1000 mSec Memory Limit : 32768 KB Proble ...
- FZU2207 以撒的结合(最近公共祖先lca,在线倍增)
Problem Description 小茗同学最近在认真地准备比赛,所以经常玩以撒的结合. <以撒的结合>是一款由Edmund McMillen,Florian Himsl 开发,并由E ...
- Uva 11354 LCA 倍增祖先
题目链接:https://vjudge.net/contest/144221#problem/B 题意:找一条从 s 到 t 的路,使得瓶颈路最小. 点的数目是10^4,如果向之前的方案求 maxc ...
- 【FOJ2207 11月月赛C】【DFS栈性质应用 离线处理】以撒的结合 从x到y路径上的第k个点 询问众多
Problem 2207 以撒的结合 Accept: 30 Submit: 98 Time Limit: 1000 mSec Memory Limit : 32768 KB Probl ...
- fzu月赛(2015.11)
Problem 2205 据说题目很水 Problem Description Sunday最近对图论特别感兴趣,什么欧拉回路什么哈密顿回路,又是环又是树.在看完一本书后,他对自己特别有信心,便找到 ...
- POJ1330-Nearest Common Ancestors【tarjan,LCA】
正题 题目链接: http://poj.org/problem?id=1330 题目大意 就是给出一棵树,求LCA(最近公共祖先) 解题思路 用tarjan求LCA,这里给出tarjan算法 代码 # ...
- wyh的商机(tarjan离线求lca)
时间限制:C/C++ 3秒,其他语言6秒 空间限制:C/C++ 262144K,其他语言524288K 64bit IO Format: %lld 题目描述 一天,你们wyh学长和你们zhl学长玩一个 ...
最新文章
- 摘:C/C++中时间类time.h
- Discuz升级 Database Error : pre_common_syscache ADD PRIMARY KEY (cname)【解决办法】
- HTML5本地存储 localStorage
- [密码学基础][每个信息安全博士生应该知道的52件事][Bristol Cryptography][第3篇]影响计算能力和存储能力的因素
- What day is that day?(快速幂,打表找周期,或者求通项公式)
- C++ Templates之模板元编程
- 安卓调用系统拍照功能:1、启动拍照返回图片,2、启动拍照,图片存储在指定路径下
- LCS2005标准版部署
- GNU make 汇总
- python滤波器处理数据的优点_使用Python对原始信号应用合适的butterworth滤波器
- 平板android怎么玩电脑游戏,Android平板模拟家用主机游戏教程_小米 平板_平板电脑新闻-中关村在线...
- java异步队对联_对联广告(带关闭的)
- 《计算机网络自顶向下》笔记
- NLP 之 jieba (结巴)制作词云
- vue框架如何将SPA项目改为SSR项目
- 计算机管理无法连接虚拟磁盘服务,win10系统电脑打开磁盘管理出现“无法连接虚拟磁盘服务”的教程...
- 单片机c语言报错_asm啥意思,SPMC75系列单片机地C和ASM( - 控制/MCU - 电子发烧友网...
- 正在与python恋爱
- mac上MAMP的各种坑
- Windows软件打包工具
热门文章
- PHP绘制圣诞树 圣诞树(油画效果)
- python anaconda安装redis_python与redis的初次碰撞——把玩redis数据库的一点心得
- 安卓 WebView 白屏(记录)
- Java笔记:JSON
- java 宠物合成 游戏,天天酷跑5个S级宠物能合成什么宠物 5个S级宠物合成宠物介绍...
- 电脑匹配,汽车节气门清洗后都要做电脑匹配吗?
- word不能输入中文
- .Net Core 智能提示汉化包
- C/C++中的system函数所有用法!
- Linux系统修复网络,解决Linux系统故障排查和修复技巧的3种方法解析与案例分享...