题目传送门

  啦啦啦,发个文纪念一下第一道在洛谷上A的黑题,一次性就过真是无比舒服~(虽然某些大佬说这题有点水……)题目其实思路不难,Tarjan缩点+LCA,不过因为是无向边,所以在Tarjan的时候做点标记就行了,不过第四个点会被卡,用vector存边就可以A掉了。另外输出用二进制这个应该没什么好说的。

  下面放代码:

  

#include<cmath>
#include<stack>
#include<vector>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
using namespace std;
const int N=;
const int M=;
int n,m,T,indexx,id,dep[N];
int low[N],dfn[N],size[N];
int f[N][],belong[N];
bool vis[N];
vector<int>edge[M<<];
vector<int>node[M<<];
stack<int>team;
inline int read()
{
char ch=getchar();int num=;bool flag=false;
while(ch<''||ch>''){if(ch=='-')flag=true;ch=getchar();}
while(ch>=''&&ch<=''){num=num*+ch-'';ch=getchar();}
return flag?-num:num;
}
inline int Min(int x,int y)
{return x<y?x:y;}
inline void tarjan(int u,int last)
{
dfn[u]=low[u]=++indexx;
vis[u]=true;team.push(u);
for(int i=;i<node[u].size();i++){
int v=node[u][i];
if(v==last)continue;
if(!dfn[v]){
tarjan(v,u);
low[u]=Min(low[u],low[v]);}
else if(vis[v])
low[u]=Min(low[u],dfn[v]);
}
if(dfn[u]==low[u]){
int v;++id;
do{
v=team.top();team.pop();
vis[v]=false;
belong[v]=id;size[id]++;
}while(v!=u);
}
}
void build()
{
for(int i=;i<=n;i++)
for(int j=;j<node[i].size();j++){
int v=node[i][j];
if(belong[i]!=belong[v])
edge[belong[i]].push_back(belong[v]);
}
}
inline void dfs(int u,int fa,int depth)
{
dep[u]=depth;f[u][]=fa;
for(int i=;i<edge[u].size();i++)
if(edge[u][i]!=fa)
dfs(edge[u][i],u,depth+);
}
void init()
{
for(int j=;j<=;j++)
for(int i=;i<=id;i++)
f[i][j]=f[f[i][j-]][j-];
}
inline int LCA(int a,int b)
{
if(dep[a]<dep[b])swap(a,b);
for(int i=;i>=;i--)
if(dep[f[a][i]]>=dep[b])
a=f[a][i];
if(a==b)return a;
for(int i=;i>=;i--)
if(f[a][i]!=f[b][i])
a=f[a][i],b=f[b][i];
return f[a][];
}
inline void print(int x)
{
if(x==)return;
print(x>>);
putchar(x%+'');
}
int main()
{
n=read();m=read();
for(int i=;i<=m;i++){
int x=read();int y=read();
node[x].push_back(y);
node[y].push_back(x);}
for(int i=;i<=n;i++)
if(!dfn[i])tarjan(i,);
build();dfs(,,);init();
T=read();
for(int i=;i<=T;i++){
int x=read();int y=read();
x=belong[x],y=belong[y];
int lca=LCA(x,y);
print((dep[x]+dep[y])-(dep[lca]<<)+);
printf("\n");
}
return ;
}

洛谷P2783 有机化学之神偶尔会作弊的更多相关文章

  1. 洛谷 P2783 有机化学之神偶尔会做作弊 解题报告

    P2783 有机化学之神偶尔会做作弊 题目背景 XS中学化学竞赛组教练是一个酷爱炉石的人. 有一天他一边搓炉石一边监考,而你作为一个信息竞赛的大神也来凑热闹. 然而你的化竞基友却向你求助了. &quo ...

  2. 洛谷 P2783 有机化学之神偶尔会做作弊(Tarjan,LCA)

    题目背景 LS中学化学竞赛组教练是一个酷爱炉石的人. 有一天他一边搓炉石一边监考,而你作为一个信息竞赛的大神也来凑热闹. 然而你的化竞基友却向你求助了. “第1354题怎么做”<--手语 他问道 ...

  3. [洛谷P2783]有机化学之神偶尔会做作弊

    第一次做出来黑题祭 虽然感觉难度其实并不到黑题的难度 题解: 其实这道题并没用什么特别的知识,只是Tarjan求双联通分量和LCA的结合. 所以,我们可以很显然的发现(如此恶劣的词汇,逃 这道题其实就 ...

  4. 【题解】Luogu P2783 有机化学之神偶尔会做作弊

    原题链接:P2783 有机化学之神偶尔会做作弊 一看,是黑题,太毒瘤了,不写 什么单链??! 只会画有机化学中正六边形的我觉得这样不行QAQ(我才初二) 当然,题目也给你了详细的解释 实际呢,这道题先 ...

  5. luogu P2783 有机化学之神偶尔会做作弊 |Tarjan+LCA

    题目背景 XS中学化学竞赛组教练是一个酷爱炉石的人. 有一天他一边搓炉石一边监考,而你作为一个信息竞赛的大神也来凑热闹. 然而你的化竞基友却向你求助了. "第1354题怎么做"&l ...

  6. LuoGu P2783 有机化学之神偶尔会做作弊

    题目传送门 人生第一道黑题呢,虽然这题是黑题中的水题并且我调了一整节课,但是我还是很兴奋啊.毕竟人生第一道黑题啊 这个题根据题意,先把整个图进行tarjan缩点,建出一棵树,对于每一组询问,两点之间的 ...

  7. P2783 有机化学之神偶尔也会作弊 题解

    题面 前言 这道题以前还是道(水)黑题,现在怎么降紫了???? 前置芝士 tarjain 缩点 倍增求LCA或树剖求LCA 脑子... 题意 给你一个无向图,要求你把所有的环缩成一个点.在新得到的图上 ...

  8. Tarjan+LCA【洛谷P2783】 有机化学之神偶尔会做作弊

    [洛谷P2783] 有机化学之神偶尔会做作弊 题目背景 XS中学化学竞赛组教练是一个酷爱炉石的人. 有一天他一边搓炉石一边监考,而你作为一个信息竞赛的大神也来凑热闹. 然而你的化竞基友却向你求助了. ...

  9. 洛谷P1774 最接近神的人_NOI导刊2010提高(02)(求逆序对)

    To 洛谷.1774 最接近神的人 题目描述 破解了符文之语,小FF开启了通往地下的道路.当他走到最底层时,发现正前方有一扇巨石门,门上雕刻着一幅古代人进行某种活动的图案.而石门上方用古代文写着“神的 ...

随机推荐

  1. git如何删除本地所有未提交的更改

    stash很好用,至少不会影响 .gitignore 里面的不跟踪的文件: git add . && git stash && git stash drop ===== ...

  2. NOI2001 方程的解数

    1735 方程的解数 http://codevs.cn/problem/1735/ 2001年NOI全国竞赛  时间限制: 5 s  空间限制: 64000 KB     题目描述 Descripti ...

  3. Ubuntu 15.04 编译UE4 for Linux版

    源 起 Unreal Engine 4 是全球最先进的Realtime Illumination & Physical 引擎: 长期以来,UE4都只有Windows版和Mac版,今年终于向Li ...

  4. Item 1----------考虑用静态工厂方法代替构造器

    读书,有时候,我感觉总是有点绕和不具体.我阅读了代码,理解代码后,才有一种理解和把握的感觉. 优点三.   把某个对象的构建放给客户端来实现. 比如下面的实现,客户端Test,获取Service的实例 ...

  5. HDU5852 Intersection is not allowed!

    There are K pieces on the chessboard. The size of the chessboard is N*N. The pieces are initially pl ...

  6. [Unity]在Shader中获取摄像机角度、视线的问题

    又踩了一坑,好在谷歌到了之前的一个人遇到相同的问题,顺利解决. 先说说问题背景,我目前的毕设是体数据渲染,实现的办法是raycast.最基本的一点就是在fragment program里,获取rayc ...

  7. Fermat2018游记

    day (-22) 2018年2月5日 Devin大佬给我发了一份Waterloo AIF的原件截图,发现里面居然直接问你的Fermat分数,那么这么重要的考试当然不能错过啊 若干天之后刚开学不久的一 ...

  8. hdu 1556(线段树之扫描线)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1556 Color the ball Time Limit: 9000/3000 MS (Java/Ot ...

  9. Java——关于static关键字的那些事总结

    前言: 先说说今天为啥要谈这个东西,虽然学Java已经有两年了,但是今天,本着温故而知新的态度,仔细的第三次翻看了<Head Firt Java>这本书,虽然这本书介绍的很多东西都特别基础 ...

  10. js 验证ip列表

    如题. <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title ...