WJC上学记
WJC上学记
题目描述:
WJC为了追求YHY,决定考上树人,但是,愚蠢的他没有足够好的成绩,只能靠自己的亲戚来帮忙。但是由于他足够愚蠢,连自己的亲戚都不认识,仁慈而被树人优录的Geek_du决定帮助他。WJC找了N(0<N<50000)个人,分别和他们进行聊天,聊了E次(0<E<30000)。请帮助WJC找到一些人和他自己的最近公共祖先。
输入说明:
输入第一行包含两个整数,N和E。分别表示N个人和E次聊天。
以下E行每一行包含两个整数,A,B表示A是B的父辈。
再下面一行包含一个整数M,表明M次查询。
下面M行每行包含两个整数,P,Q,询问P和Q的最近公共祖先。
输出说明:
对于每个查询,给出他们的最近公共祖先。
样例输入:
4 3
1 2
2 3
2 4
1
3 4
样例输出:
2
数据范围:
100%:0<N<5000,0<E<30000
LCA最近公共祖先模板题
/* ***********************************************
Author :buaaasd
Created Time :2016/1/23 19:48:00
File Name :1.cpp
************************************************ */
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <stdio.h>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <string>
#include <math.h>
#include <stdlib.h>
#include <iomanip>
#include <list>
#include <deque>
#include <stack>
#define ull unsigned long long
#define ll long long
#define mod 90001
#define INF 0x3f3f3f3f
#define maxn 100000+10
#define cle(a) memset(a,0,sizeof(a))
const ull inf = 1LL << ;
const double eps=1e-;
using namespace std; bool cmp(int a,int b){
return a>b;
}
int fa[maxn],n,m,pre[maxn],l;
int qpre[maxn];
int ans[maxn*];
struct node{
int v,next;
}edge[maxn+];
struct Node{
int qv,qnext,id;
}qedge[maxn*]; void add(int u,int v){
edge[l].v=v;
edge[l].next=pre[u];
pre[u]=l++;
}
void qadd(int u,int v,int id){
qedge[l].qv=v;
qedge[l].id=id;
qedge[l].qnext=qpre[u];
qpre[u]=l++;
}
int findfa(int x){
if(x==fa[x])return x;
else return fa[x]=findfa(fa[x]);
}
void Union(int x,int y){
x=findfa(x);
y=findfa(y);
fa[y]=x;
}
void dfs(int u){
int v;
fa[u]=u;
for(int i=pre[u];i+;i=edge[i].next){
v=edge[i].v;
if(fa[v]==-){
dfs(v);
Union(u,v);
}
}
/*
for(v=1;v<=n;v++){
if(fa[v]!=-1){
lca[u][v]=lca[v][u]=findfa(v);
}
}*/
for(int i=qpre[u];i+;i=qedge[i].qnext){
v=qedge[i].qv;
if(fa[v]!=-){
int id=qedge[i].id;
ans[id]=findfa(v);
}
}
}
int main()
{
#ifndef ONLINE_JUDGE
//freopen("in.txt","r",stdin);
#endif
//freopen("out.txt","w",stdout);
int x,y;
while(cin>>n>>m){
l=;
memset(fa,-,sizeof fa);
memset(pre,-,sizeof pre);
memset(qpre,-,sizeof qpre);
for(int i=;i<=m;i++){
cin>>x>>y;
add(x,y);
}
l=;
int k;
cin>>k;
for(int i=;i<=k;i++){
scanf("%d%d",&x,&y);
qadd(x,y,i);
qadd(y,x,i);
}
dfs();
for(int i=;i<=k;i++){
printf("%d\n",ans[i]);
} }
return ;
}
借鉴了网上的许多代码,最后总结的模板。
这个博主写的最清晰。https://comzyh.com/blog/archives/492/ 而且有图真是极好的。
链式前向星pre[u]代表以u为起点的第一条边的位置。edge[l].v存储边的终点。edge[l].next存储下一条边的位置。
WJC上学记的更多相关文章
- D - 小Y上学记——要迟到了!
D - 小Y上学记——要迟到了! Time Limit: 2000/1000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Others) ...
- C - 小Y上学记——认识新同学
C - 小Y上学记——认识新同学 Time Limit: 4000/2000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Others) ...
- B - 小Y上学记——小Y的玩偶
B - 小Y上学记——小Y的玩偶 Time Limit: 2000/1000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Others) ...
- A - 小Y上学记——修学分
A - 小Y上学记——修学分 Time Limit: 2000/1000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Others) S ...
- “IT学子成长指导”专栏及文章目录 —贺利坚
迂者专栏关键词 就 业 大一 大二 大三 大四 自学 职 场 专业+兴趣 研究生 硕士 规 划 考 研 大学生活 迷 茫 计算机+专业 基本功 学习方法 编程 基 础 实践 读书 前 途 成 长 社团 ...
- 书单list
2018年对我来说是个踩到狗屎的一年,不能说运气差,只能说过去所有的不良决策后果都集中到2018年爆发了,希望新的一年,都好起来.书单很短,买的确实很多,真的惭愧. 昨日世界 南渡北归 上学记 回忆录 ...
- codevs2693 上学路线(施工)
难度等级:黄金 2693 上学路线(施工) 题目描述 Description 问题描述 你所在的城市街道好像一个棋盘,有a条南北方向的街道和b条东西方向的街道. 南北方向a条街道从西到东依次编号为1到 ...
- THUWC逛街记
1/28 这次打算去THUWC划个水,就定了1/29中午的飞机.同校有几个同学去PKUWC,求稳搭今天的飞机.中午时候听说今天飞长沙的飞机全都取消了,明天有没有也不好说( 事实证明29号有飞机:( ) ...
- 洛谷 P4478 [BJWC2018]上学路线
洛谷 P4478 [BJWC2018]上学路线 原题 神仙题orz,竟然没有1A....容斥+卢卡斯+crt?? 首先用容斥做,记\(f[i][0/1]\)表示到i号点经过了奇数/偶数个点的方案数,因 ...
随机推荐
- java解决前后台跨域问题
这篇文章主要介绍了使用Cors实现JavaWeb跨域请求问题的方法,非常不错,具有参考借鉴价值,需要的朋友可以参考下 之前用jsonp 解决跨域问题,现在用CORS实现跨域请求解决java 跨域问题: ...
- 学习shell脚本之乘法口诀
脚本如下: #!/bin/bash for i in 'seq 1 9' do for j in 'seq 1 $i' do k=$[$i*$j] echo -ne "$j"&qu ...
- jenkins异常解答
1.安装插件时offline 需要更换插件管理中的升级URL http://mirror.xmission.com/jenkins/updates/current/update-center.js ...
- 通过new ClasspathApplicationContext("applicationContext.xml")找不到文件时
可以把applicationContext.xml放到/WEB-INF/classes目录下使用先说:ClassPathXmlApplicationContext 这个类,默认获取的是WEB-INF/ ...
- POJ1861 Network
Time Limit: 1000MS Memory Limit: 30000KB 64bit IO Format: %lld & %llu Description Andrew is ...
- linux内核中预留4M以上大内存的方法
在内核中, kmalloc能够分配的最大连续内存为2的(MAX_ORDER-1)次方个page(参见alloc_pages函数, "if (unlikely(order >= ...
- hdu1853/ hdu 3488 有向图,取k个圈覆盖所有点一次//费用流
哎╮(╯▽╰)╭,这是费用流基础题型,拆点,建二分图,跑最小费用最大流即可.若最大流为n,则说明是最大匹配为n,所有点都参与,每个点的入度和出度又是1,所以就是环. 弱菜还需努力! #include& ...
- hdu4848 求到达每个点总时间最短(sum[d[i]])。
开始的时候是暴力dfs+剪枝,怎么也不行.后来参考他人思想: 先求出每个点之间的最短路(这样预处理之后的搜索就可以判重返回了),截肢还是关键:1最优性剪枝(尽量最优:目前的状态+预计还有的最小时间&g ...
- [bzoj3308]九月的咖啡店_欧拉筛素数_费用流
bzoj-3308 九月的咖啡店 题目大意:深绘里在九份开了一家咖啡让,如何调配咖啡民了她每天的头等大事我们假设她有N种原料,第i种原料编号为i,调配一杯咖啡则需要在这里若干种兑在一起.不过有些原料不 ...
- sugar与阿龙的互怼(第一季)
§ 第一季 回家风波 高考了,啦啦啦~ 快要高考了,显然sugar很伤心. 显然不是因为快要考试了sugar才伤心的. 那为什么??? 因为他们都回家了,但是sugar和他的小伙伴们都不回家!!! ...