【洛谷P2783】 有机化学之神偶尔会做作弊

题目背景

XS中学化学竞赛组教练是一个酷爱炉石的人。

有一天他一边搓炉石一边监考,而你作为一个信息竞赛的大神也来凑热闹。

然而你的化竞基友却向你求助了。

“第1354题怎么做”<--手语 他问道。

题目描述

你翻到那一题:给定一个烃,只含有单键(给初中生的一个理解性解释:就是一堆碳用横线连起来,横线都是单条的)。

然后炎魔之王拉格纳罗斯用他的火焰净化了一切环(???)。所有的环状碳都变成了一个碳。如图所示。

然后指定多组碳,求出它们之间总共有多少碳。

但是因为在考试,所以你只能把这个答案用手语告诉你的基友。你决定用二进制来表示最后的答案。如图所示(不要在意,和题目没有什么没关系)。

输入输出格式

输入格式:

第一行两个整数n,m.表示有n个点,m根键

接下来m行每行两个整数u,v表示u号碳和v号碳有一根键

接下来一个整数tot表示询问次数

接下来tot行每行两个整数,a,b表示询问的两个碳的编号

输出格式:

共tot行

每行一个二进制数

Tarjan+LCA。

注意两个碳不成环,向Tarjan中传一个参数f,判一下v是不是等于f就好了。

话说我WA了好多次、

code:

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. using namespace std;
  5. const int wx=50017;
  6. inline int read(){
  7. int sum=0,f=1;char ch=getchar();
  8. while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
  9. while(ch>='0'&&ch<='9'){sum=(sum<<1)+(sum<<3)+ch-'0';ch=getchar();}
  10. return sum*f;
  11. }
  12. int num,Num,tot,top,n,m,q,col,ans;
  13. int head[wx],h[wx],dep[wx],dfn[wx],low[wx],st[wx],belong[wx],f[wx][23];
  14. struct E{
  15. int nxt,to;
  16. }e[wx*2];
  17. void up(int from,int to){
  18. e[++Num].nxt=h[from];
  19. e[Num].to=to;
  20. h[from]=Num;
  21. }
  22. struct ee{
  23. int nxt,to;
  24. }edge[wx*2];
  25. void add(int from,int to){
  26. edge[++num].nxt=head[from];
  27. edge[num].to=to;
  28. head[from]=num;
  29. }
  30. void Tarjan(int u,int fa){
  31. dfn[u]=low[u]=++tot;
  32. st[++top]=u;
  33. for(int i=h[u];i;i=e[i].nxt){
  34. int v=e[i].to;
  35. if(e[i].to==fa)continue;
  36. if(!dfn[v]){
  37. Tarjan(v,u);
  38. low[u]=min(low[u],low[v]);
  39. }
  40. else if(!belong[v]){
  41. low[u]=min(low[u],dfn[v]);
  42. }
  43. }
  44. if(low[u]==dfn[u]){
  45. belong[u]=++col;
  46. while(st[top]!=u){
  47. belong[st[top]]=col;
  48. top--;
  49. }
  50. top--;
  51. }
  52. }
  53. void dfs(int u,int fa){
  54. dep[u]=dep[fa]+1;
  55. for(int i=head[u];i;i=edge[i].nxt){
  56. int v=edge[i].to;
  57. if(v==fa)continue;
  58. f[v][0]=u;
  59. dfs(v,u);
  60. }
  61. }
  62. void pre(){
  63. for(int j=1;j<=21;j++)for(int i=1;i<=n;i++)f[i][j]=f[f[i][j-1]][j-1];
  64. }
  65. int LCA(int x,int y){
  66. if(dep[x]<dep[y])swap(x,y);
  67. for(int i=21;i>=0;i--)if(dep[f[x][i]]>=dep[y])x=f[x][i];
  68. if(x==y)return x;
  69. for(int i=21;i>=0;i--)if(f[x][i]!=f[y][i])x=f[x][i],y=f[y][i];
  70. return f[x][0];
  71. }
  72. int main(){
  73. n=read();m=read();
  74. for(int i=1;i<=m;i++){
  75. int x,y;
  76. x=read();y=read();
  77. up(x,y);up(y,x);
  78. }
  79. for(int i=1;i<=n;i++)if(!dfn[i])Tarjan(i,0);
  80. for(int u=1;u<=n;u++){
  81. for(int i=h[u];i;i=e[i].nxt){
  82. int v=e[i].to;
  83. if(belong[u]!=belong[v]){
  84. add(belong[u],belong[v]);
  85. // add(belong[v],belong[u]);
  86. }
  87. }
  88. }
  89. dfs(belong[1],0);pre();
  90. // for(int i=1;i<=n;i++)printf("zz%d %d\n",i,dep[i]);
  91. q=read();
  92. for(int i=1;i<=q;i++){
  93. int x,y;
  94. x=read();y=read();
  95. x=belong[x];y=belong[y];
  96. int lca=LCA(x,y);
  97. int ans=dep[x]+dep[y]-2*dep[lca]+1;
  98. int tmp=0,a[18];
  99. while(ans){
  100. a[++tmp]=ans%2;
  101. ans/=2;
  102. }
  103. for(int i=tmp;i>=1;i--)printf("%d",a[i]);
  104. puts("");
  105. }
  106. return 0;
  107. }

Tarjan+LCA【洛谷P2783】 有机化学之神偶尔会做作弊的更多相关文章

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

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

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

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

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

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

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

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

  5. 洛谷P2783 有机化学之神偶尔会作弊

    题目传送门 啦啦啦,发个文纪念一下第一道在洛谷上A的黑题,一次性就过真是无比舒服-(虽然某些大佬说这题有点水……)题目其实思路不难,Tarjan缩点+LCA,不过因为是无向边,所以在Tarjan的时候 ...

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

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

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

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

  8. Tarjan缩点+LCA【p2783】有机化学之神偶尔会做作弊

    Description 你翻到那一题:给定一个烃,只含有单键(给初中生的一个理解性解释:就是一堆碳用横线连起来,横线都是单条的). 然后炎魔之王拉格纳罗斯用他的火焰净化了一切环(???).所有的环状碳 ...

  9. [luogu2783] 有机化学之神偶尔会做作弊

    题目链接 洛谷. Solution 边双缩点然后\(lca\)跑\(dis\)就好了. 注意这里是边双,不知道为啥所有题解都说的是点双. 边双是定义在点上的,即每个点只属于一个边双:点双是定义在边上的 ...

随机推荐

  1. 2015.1.15 利用Oracle函数插入表结构 Bulk collect into 不用循环,简洁高效

    如果表结构只对应一个字段,可以 select col1 bulk collect into 变量,不用游标循环,简洁高效 create or replace function get_airway_s ...

  2. python jvm数据

    在网上找的抱歉忘了原链接了额 #!/usr/bin/env python # # import os import commands import re import sys (status1, re ...

  3. Django之时区

    在settings.py中修改如下配置: TIME_ZONE = 'Asia/Shanghai' USE_I18N = True USE_L10N = True USE_TZ = False 这样在m ...

  4. Vue基础汇总

    1)双向绑定: <div id="app"> <p>{{message}}</p> <input v-model="messag ...

  5. oracle中函数和存储过程的区别和联系

    oracle中函数和存储过程的区别和联系 在oracle中,函数和存储过程是经常使用到的,他们的语法中有很多相似的地方,但也有自己的特点.刚学完函数和存储过程,下面来和大家分享一下自己总结的关于函数和 ...

  6. java多线程编程——同步器Exchanger

    类java.util.concurrent.Exchanger提供了一个同步点,在这个同步点,一对线程可以交换数据.每个线程通过exchange()方法的入口提供数据给他的伙伴线程,并接收他的伙伴线程 ...

  7. .Net时间运算 - DateTime类,TimeSpan类

    DateTime类是.Net中用于处理时间类型数据的. 一.字段 MaxValue 表示 DateTime 的最大可能值.此字段为只读. MinValue     表示 DateTime 的最小可能值 ...

  8. 一行代码搞定所有屏幕适配AbViewUtil

    适配原理:抛弃google提供的dip理论与多套图片与布局方案,采用与UI设计师通用的px作为标准单位,原理是将UI设计师的设计图与当前查看的手机或其他设备的屏幕像素尺寸进行换算,得到缩放比例,在Ac ...

  9. [patl2-011]玩转二叉树

    解题关键:数据结构课本上的裸题. #include<cstdio> #include<cstdlib> #include<cstring> #include< ...

  10. cocos2dx中的内存管理方式

    转载:http://www.cocoachina.com/bbs/read.php?tid=195219 今天看了一下cocos2dx的内存管理机制,有些地方不太好理解搞了挺长的时间,现在感觉自己理解 ...