Tarjan+LCA【洛谷P2783】 有机化学之神偶尔会做作弊
【洛谷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:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int wx=50017;
inline int read(){
	int sum=0,f=1;char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){sum=(sum<<1)+(sum<<3)+ch-'0';ch=getchar();}
	return sum*f;
}
int num,Num,tot,top,n,m,q,col,ans;
int head[wx],h[wx],dep[wx],dfn[wx],low[wx],st[wx],belong[wx],f[wx][23];
struct E{
	int nxt,to;
}e[wx*2];
void up(int from,int to){
	e[++Num].nxt=h[from];
	e[Num].to=to;
	h[from]=Num;
}
struct ee{
	int nxt,to;
}edge[wx*2];
void add(int from,int to){
	edge[++num].nxt=head[from];
	edge[num].to=to;
	head[from]=num;
}
void Tarjan(int u,int fa){
	dfn[u]=low[u]=++tot;
	st[++top]=u;
	for(int i=h[u];i;i=e[i].nxt){
		int v=e[i].to;
		if(e[i].to==fa)continue;
		if(!dfn[v]){
			Tarjan(v,u);
			low[u]=min(low[u],low[v]);
		}
		else if(!belong[v]){
			low[u]=min(low[u],dfn[v]);
		}
	}
	if(low[u]==dfn[u]){
		belong[u]=++col;
		while(st[top]!=u){
			belong[st[top]]=col;
			top--;
		}
		top--;
	}
}
void dfs(int u,int fa){
	dep[u]=dep[fa]+1;
	for(int i=head[u];i;i=edge[i].nxt){
		int v=edge[i].to;
		if(v==fa)continue;
		f[v][0]=u;
		dfs(v,u);
	}
}
void pre(){
	for(int j=1;j<=21;j++)for(int i=1;i<=n;i++)f[i][j]=f[f[i][j-1]][j-1];
}
int LCA(int x,int y){
	if(dep[x]<dep[y])swap(x,y);
	for(int i=21;i>=0;i--)if(dep[f[x][i]]>=dep[y])x=f[x][i];
	if(x==y)return x;
	for(int i=21;i>=0;i--)if(f[x][i]!=f[y][i])x=f[x][i],y=f[y][i];
	return f[x][0];
}
int main(){
	n=read();m=read();
	for(int i=1;i<=m;i++){
		int x,y;
		x=read();y=read();
		up(x,y);up(y,x);
	}
	for(int i=1;i<=n;i++)if(!dfn[i])Tarjan(i,0);
	for(int u=1;u<=n;u++){
		for(int i=h[u];i;i=e[i].nxt){
			int v=e[i].to;
			if(belong[u]!=belong[v]){
				add(belong[u],belong[v]);
//				add(belong[v],belong[u]);
			}
		}
	}
	dfs(belong[1],0);pre();
//	for(int i=1;i<=n;i++)printf("zz%d %d\n",i,dep[i]);
	q=read();
	for(int i=1;i<=q;i++){
		int x,y;
		x=read();y=read();
		x=belong[x];y=belong[y];
		int lca=LCA(x,y);
		int ans=dep[x]+dep[y]-2*dep[lca]+1;
		int tmp=0,a[18];
		while(ans){
			a[++tmp]=ans%2;
			ans/=2;
		}
		for(int i=tmp;i>=1;i--)printf("%d",a[i]);
		puts("");
	}
	return 0;
}
Tarjan+LCA【洛谷P2783】 有机化学之神偶尔会做作弊的更多相关文章
- 洛谷 P2783 有机化学之神偶尔会做作弊 解题报告
		P2783 有机化学之神偶尔会做作弊 题目背景 XS中学化学竞赛组教练是一个酷爱炉石的人. 有一天他一边搓炉石一边监考,而你作为一个信息竞赛的大神也来凑热闹. 然而你的化竞基友却向你求助了. &quo ... 
- 洛谷 P2783 有机化学之神偶尔会做作弊(Tarjan,LCA)
		题目背景 LS中学化学竞赛组教练是一个酷爱炉石的人. 有一天他一边搓炉石一边监考,而你作为一个信息竞赛的大神也来凑热闹. 然而你的化竞基友却向你求助了. “第1354题怎么做”<--手语 他问道 ... 
- [洛谷P2783]有机化学之神偶尔会做作弊
		第一次做出来黑题祭 虽然感觉难度其实并不到黑题的难度 题解: 其实这道题并没用什么特别的知识,只是Tarjan求双联通分量和LCA的结合. 所以,我们可以很显然的发现(如此恶劣的词汇,逃 这道题其实就 ... 
- 【题解】Luogu P2783 有机化学之神偶尔会做作弊
		原题链接:P2783 有机化学之神偶尔会做作弊 一看,是黑题,太毒瘤了,不写 什么单链??! 只会画有机化学中正六边形的我觉得这样不行QAQ(我才初二) 当然,题目也给你了详细的解释 实际呢,这道题先 ... 
- 洛谷P2783 有机化学之神偶尔会作弊
		题目传送门 啦啦啦,发个文纪念一下第一道在洛谷上A的黑题,一次性就过真是无比舒服-(虽然某些大佬说这题有点水……)题目其实思路不难,Tarjan缩点+LCA,不过因为是无向边,所以在Tarjan的时候 ... 
- luogu P2783 有机化学之神偶尔会做作弊 |Tarjan+LCA
		题目背景 XS中学化学竞赛组教练是一个酷爱炉石的人. 有一天他一边搓炉石一边监考,而你作为一个信息竞赛的大神也来凑热闹. 然而你的化竞基友却向你求助了. "第1354题怎么做"&l ... 
- LuoGu  P2783 有机化学之神偶尔会做作弊
		题目传送门 人生第一道黑题呢,虽然这题是黑题中的水题并且我调了一整节课,但是我还是很兴奋啊.毕竟人生第一道黑题啊 这个题根据题意,先把整个图进行tarjan缩点,建出一棵树,对于每一组询问,两点之间的 ... 
- Tarjan缩点+LCA【p2783】有机化学之神偶尔会做作弊
		Description 你翻到那一题:给定一个烃,只含有单键(给初中生的一个理解性解释:就是一堆碳用横线连起来,横线都是单条的). 然后炎魔之王拉格纳罗斯用他的火焰净化了一切环(???).所有的环状碳 ... 
- [luogu2783] 有机化学之神偶尔会做作弊
		题目链接 洛谷. Solution 边双缩点然后\(lca\)跑\(dis\)就好了. 注意这里是边双,不知道为啥所有题解都说的是点双. 边双是定义在点上的,即每个点只属于一个边双:点双是定义在边上的 ... 
随机推荐
- 设置windows10  背景颜色
			[Win + R ] regedit 打开注册表 HKEY_CURRENT_USER\Control Panel\Colors 1.[InfoWindow] 默认为(白色):255 255 255, ... 
- Python多进程-进程间数据的共享
			不同的进程不能同时修改一份数据,但是不同的进程能对一份数据进行修改 可通过Manager来实现进程间的数据共享 # -*- coding:utf-8 -*- __author__ = "Mu ... 
- 2016.8.17服务器端数据库用户导入导出方法 expdp和impdp
			EXP和IMP是客户端工具程序,它们既可以在客户端使用,也可以在服务端使用. EXPDP和IMPDP是服务端的工具程序,他们只能在ORACLE服务端使用,不能在客户端使用. IMP只适用于EXP导出的 ... 
- 问题:C#  TrimEnd  去掉最后的逗号;结果: C#中 TrimEnd()用法
			C#中 TrimEnd()用法 ①去除最后的逗号 string str=ab,cd,ef,; str=str.TrimEnd(new char[] { ',' }); 返回结果则是:ab,cd,ef ... 
- 问题:PLS-00204: 函数或伪列 'EXISTS' 只能在 SQL 语句中使用;结果:PL/SQL中不能用exists函数?
			怎么写了一个语句带出这样的结果. 语句: if exists (select * from sysdatabases where name='omni') then 结果: ERROR 位于第 4 行 ... 
- 『原』在Linux下反编译Android .apk文件   使用apktool dex2jar JD-eclipse
			一.使用apktool 将 apk反编译生成程序的源代码和图片.XML配置.语言资源等文件 具体步骤: (1)下载反编译工具包:apktool 官方的打不开 http://apktool.shouji ... 
- springmvc 注解式开发 接收请求参数
			1.校正请求参数名: 2.以对象形式整体接收 3.路径变量: 
- 关于web.xml中的<welcome-file-list>中的默认首页文件
			先看我的配置文件: <welcome-file-list> <welcome-file>index.html</welcome-file> </welcome ... 
- HDU 6395(2018多校第7场1010)Sequence
			不久前做过POJ3070,所以知道这题要用矩阵快速幂优化,但是这个题的递推公式中有一项⌊p/n⌋,场上就不会了... 下来才知道要用分块矩阵快速幂,因为⌊p/n⌋最多有2√p块,可以对每一块使用快速幂 ... 
- Python 安装 django框架
			1.安装 pip install django 2.创建项目 d:/www/django文件夹下右键->打开dos窗口 输入: python C:\ProgramData\Miniconda3\ ... 
