洛谷P2783 有机化学之神偶尔会作弊
啦啦啦,发个文纪念一下第一道在洛谷上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 有机化学之神偶尔会作弊的更多相关文章
- 洛谷 P2783 有机化学之神偶尔会做作弊 解题报告
P2783 有机化学之神偶尔会做作弊 题目背景 XS中学化学竞赛组教练是一个酷爱炉石的人. 有一天他一边搓炉石一边监考,而你作为一个信息竞赛的大神也来凑热闹. 然而你的化竞基友却向你求助了. &quo ...
- 洛谷 P2783 有机化学之神偶尔会做作弊(Tarjan,LCA)
题目背景 LS中学化学竞赛组教练是一个酷爱炉石的人. 有一天他一边搓炉石一边监考,而你作为一个信息竞赛的大神也来凑热闹. 然而你的化竞基友却向你求助了. “第1354题怎么做”<--手语 他问道 ...
- [洛谷P2783]有机化学之神偶尔会做作弊
第一次做出来黑题祭 虽然感觉难度其实并不到黑题的难度 题解: 其实这道题并没用什么特别的知识,只是Tarjan求双联通分量和LCA的结合. 所以,我们可以很显然的发现(如此恶劣的词汇,逃 这道题其实就 ...
- 【题解】Luogu P2783 有机化学之神偶尔会做作弊
原题链接:P2783 有机化学之神偶尔会做作弊 一看,是黑题,太毒瘤了,不写 什么单链??! 只会画有机化学中正六边形的我觉得这样不行QAQ(我才初二) 当然,题目也给你了详细的解释 实际呢,这道题先 ...
- luogu P2783 有机化学之神偶尔会做作弊 |Tarjan+LCA
题目背景 XS中学化学竞赛组教练是一个酷爱炉石的人. 有一天他一边搓炉石一边监考,而你作为一个信息竞赛的大神也来凑热闹. 然而你的化竞基友却向你求助了. "第1354题怎么做"&l ...
- LuoGu P2783 有机化学之神偶尔会做作弊
题目传送门 人生第一道黑题呢,虽然这题是黑题中的水题并且我调了一整节课,但是我还是很兴奋啊.毕竟人生第一道黑题啊 这个题根据题意,先把整个图进行tarjan缩点,建出一棵树,对于每一组询问,两点之间的 ...
- P2783 有机化学之神偶尔也会作弊 题解
题面 前言 这道题以前还是道(水)黑题,现在怎么降紫了???? 前置芝士 tarjain 缩点 倍增求LCA或树剖求LCA 脑子... 题意 给你一个无向图,要求你把所有的环缩成一个点.在新得到的图上 ...
- Tarjan+LCA【洛谷P2783】 有机化学之神偶尔会做作弊
[洛谷P2783] 有机化学之神偶尔会做作弊 题目背景 XS中学化学竞赛组教练是一个酷爱炉石的人. 有一天他一边搓炉石一边监考,而你作为一个信息竞赛的大神也来凑热闹. 然而你的化竞基友却向你求助了. ...
- 洛谷P1774 最接近神的人_NOI导刊2010提高(02)(求逆序对)
To 洛谷.1774 最接近神的人 题目描述 破解了符文之语,小FF开启了通往地下的道路.当他走到最底层时,发现正前方有一扇巨石门,门上雕刻着一幅古代人进行某种活动的图案.而石门上方用古代文写着“神的 ...
随机推荐
- JS判断内容为空方法总结
HTML代码: 用户名:<input type="text" id="username"> <p style="color:red& ...
- c# “XXX::Invoke”类型的已垃圾回收委托进行了回调。这可能会导致应用程序崩溃、损坏和数据丢失。向非托管代码传递委托时,托管应用程序必须让这些委托保持活动状态,直到确信不会再次调用它们。
症状描述如下: 如果将一个委托作为函数指针从托管代码封送到非托管代码,并且在对该委托进行垃圾回收后对该函数指针发出了一个回调,则将激活 callbackOnCollectedDelegate 托管调试 ...
- IIS 搭建
1. 在打开程序功能里面,点击IIS安装.注意要选择适当的各种有用的服务.例如默认文档就需要安装非IIS下面的选项. 2. IIS部署网站可以参考网上的步骤.会遇到500处理程序“Extensionl ...
- 例子Architecting Android…The clean way?----代码分析
Presention层: 整个应用启动的时候,就执行依赖的初始化.编译项目之后,Dagger依赖框架使用ApplicationComponent生成一个DaggerApplicationCOmpo ...
- android程序员成长路径的思考
我之前就想过要写这个话题,不过之前没有什么认识,我只是在阅读别人的见解,看法.昨天晚上,我阅读了这篇文章<产品经理罗永浩:用户体验探索,没有尽头>,这篇文章描述了罗永浩对锤子手机设计细节的 ...
- 【BZOJ】3038: 上帝造题的七分钟2 && 3211: 花神游历各国
[算法]线段树||树状数组&&并查集 [题解]修改必须暴力单点修改,然后利用标记区间查询. 优化:一个数经过不断开方很快就会变成1,所以维护区间最大值. 修改时访问到的子树最大值< ...
- Vue 使用中的小技巧(山东数漫江湖)
在vue的使用过程中会遇到各种场景,当普通使用时觉得没什么,但是或许优化一下可以更高效更优美的进行开发.下面有一些我在日常开发的时候用到的小技巧,在下将不定期更新~ 1. 多图表resize事件去中心 ...
- Fire! (双bfs+预处理)
题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem ...
- hdu 1869 六度分离(最短路floyd)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1869 六度分离 Time Limit: 5000/1000 MS (Java/Others) M ...
- 【shell】shell编程(六)-shell函数的应用
linux shell 可以用户定义函数,然后在shell脚本中可以随便调用. shell中函数的定义格式如下: [ function ] funname [()] { action; [return ...