洛谷 P2783 有机化学之神偶尔会做作弊 解题报告
P2783 有机化学之神偶尔会做作弊
题目背景
XS中学化学竞赛组教练是一个酷爱炉石的人。
有一天他一边搓炉石一边监考,而你作为一个信息竞赛的大神也来凑热闹。
然而你的化竞基友却向你求助了。
“第1354题怎么做”<--手语 他问道。
题目描述
你翻到那一题:给定一个烃,只含有单键(给初中生的一个理解性解释:就是一堆碳用横线连起来,横线都是单条的)。
然后炎魔之王拉格纳罗斯用他的火焰净化了一切环(???)。所有的环状碳都变成了一个碳。如图所示。
然后指定多组碳,求出它们之间总共有多少碳。如图所示(和上图没有关系)。
但是因为在考试,所以你只能把这个答案用手语告诉你的基友。你决定用二进制来表示最后的答案。如图所示(不要在意,和题目没有什么没关系)。
输入输出格式
输入格式:
第一行两个整数\(n,m\).表示有\(n\)个点,\(m\)根键
接下来\(m\)行每行两个整数\(u\),\(v\)表示\(u\)号碳和\(v\)号碳有一根键
接下来一个整数\(tot\)表示询问次数
接下来\(tot\)行每行两个整数,\(a,b\)表示询问的两个碳的编号
输出格式:
共\(tot\)行
每行一个二进制数
说明
1<n<=10000,1<m<=50000
(两个碳不成环)
人生中第一道A掉的黑题!2018.6.9
其实这题思想上不难,简化一下问题即是:对于一个无向图,先把环给缩点缩掉,然后求\(LCA\)即可。
code:
#include <cstdio>
#include <vector>
#include <cstring>
using namespace std;
const int N=10010;
const int M=50010;
struct Edge
{
int to,next;
}edge[M<<1],edge1[M<<1];
vector <int > g[N];
int head[N],cnt=0,n,m,head1[N],cnt1=0;
void add(int u,int v)
{
edge[++cnt].next=head[u];edge[cnt].to=v;head[u]=cnt;
}
void add1(int u,int v)
{
edge1[++cnt1].next=head1[u];edge1[cnt1].to=v;head1[u]=cnt1;
}
int time=0,dfn[N],low[N],used[N],ha[N],f[N],s[N],ans[N],dis[N],tot=0,n0=0;
void push(int x){s[++tot]=x;}
void pop(){tot--;}
void tarjan(int now,int fa)
{
dfn[now]=low[now]=++time;
push(now);
used[now]=1;
for(int i=head[now];i;i=edge[i].next)
{
int v=edge[i].to;
if(v!=fa)
{
if(!dfn[v])
{
tarjan(v,now);
low[now]=min(low[now],low[v]);
}
else if(used[v])
low[now]=min(low[now],dfn[v]);
}
}
if(low[now]==dfn[now])
{
n0++;
int k;
do
{
k=s[tot];
ha[k]=n0;
used[k]=0;
pop();
}while(k!=now);
}
}
int find(int x)
{
return f[x]=f[x]==x?x:find(f[x]);
}
void merge(int x,int y)
{
f[find(y)]=find(x);
}
void LCA(int now)//求解lca
{
used[now]=1;
for(int i=0;i<g[now].size();i++)
{
int v=g[now][i];
if(!used[v])
{
LCA(v);
merge(now,v);
}
}
for(int i=head1[now];i;i=edge1[i].next)
{
int v=edge1[i].to;
if(used[v])
{
int anc=find(v);
ans[i+1>>1]=dis[v]+dis[now]-(dis[anc]<<1)+1;
}
}
}
void out(int x)
{
int len=0,tt[20];
while(x)
{
tt[++len]=x&1;
x>>=1;
}
for(int i=len;i;i--)
printf("%d",tt[i]);
printf("\n");
}
void dfs0(int now,int dep)
{
used[now]=1;
dis[now]=dep;
for(int i=0;i<g[now].size();i++)
{
int v=g[now][i];
if(!used[v]) dfs0(v,dep+1);
}
}
void init()
{
for(int i=1;i<=n0;i++) f[i]=i;
for(int i=1;i<=n0;i++)
if(!used[i])
dfs0(i,1);
}
int main()
{
scanf("%d%d",&n,&m);
int u,v,q;
for(int i=1;i<=m;i++)
{
scanf("%d%d",&u,&v);
add(u,v),add(v,u);
}
for(int i=1;i<=n;i++)
if(!dfn[i])
tarjan(i,0);
for(int i=1;i<=n;i++)
for(int j=head[i];j;j=edge[j].next)
{
int v=edge[j].to;
if(ha[v]!=ha[i])
g[ha[i]].push_back(ha[v]);
}
scanf("%d",&q);
for(int i=1;i<=q;i++)
{
scanf("%d%d",&u,&v);
add1(ha[u],ha[v]);
add1(ha[v],ha[u]);
}
init();
memset(used,0,sizeof(used));
for(int i=1;i<=n0;i++)
if(!used[i])
LCA(i);
for(int i=1;i<=q;i++)
out(ans[i]);
return 0;
}
2018.6.9
洛谷 P2783 有机化学之神偶尔会做作弊 解题报告的更多相关文章
- 洛谷 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】 有机化学之神偶尔会做作弊
[洛谷P2783] 有机化学之神偶尔会做作弊 题目背景 XS中学化学竞赛组教练是一个酷爱炉石的人. 有一天他一边搓炉石一边监考,而你作为一个信息竞赛的大神也来凑热闹. 然而你的化竞基友却向你求助了. ...
- [luogu2783] 有机化学之神偶尔会做作弊
题目链接 洛谷. Solution 边双缩点然后\(lca\)跑\(dis\)就好了. 注意这里是边双,不知道为啥所有题解都说的是点双. 边双是定义在点上的,即每个点只属于一个边双:点双是定义在边上的 ...
- 【洛谷 P2783】 有机化学之神偶尔会做作弊 (双联通分量)
题目链接 可能是除了<概率论>的最水的黑题了吧 用\(Tarjan\)缩点(点双联通分量),然后就是树上两点之间的距离了,跑\(LCA\)就好了. #include <cstdio& ...
随机推荐
- [Spark][Python]对HDFS 上的文件,采用绝对路径,来读取获得 RDD
对HDFS 上的文件,采用绝对路径,来读取获得 RDD: In [102]: mydata=sc.textFile("file:/home/training/test.txt")1 ...
- 事务,acid,cap,paxos随笔
事务ACID四个特性: A:原子性(Atomicity)C:一致性(Consistency)I:隔离性(Isolation)D:持久性(Durability) 原子性:语句要么全执行,要么全不执行,是 ...
- MVC_防止HttpPost重复提交
重复提交的场景很常见,可能是当时服务器延迟的原因,如购物车物品叠加,重复提交多个订单.常见的解决方法是提交后把Button在客户端Js禁用,或是用Js禁止后退键等.在ASP.NET MVC 3 Web ...
- Linux mount 命令
mount 命令用来挂载文件系统.其基本命令格式为:mount -t type [-o options] device dirdevice:指定要挂载的设备,比如磁盘.光驱等.dir:指定把文件系统挂 ...
- U盘、移动硬盘等弹出 “文件或目录损坏且无法读取” 实测解决办法
U盘跟其他的机器一样,使用久了难免会出故障,比如常见的弹出一个文件或目录损坏且无法读取的对话框,吓你一跳,整个U盘都损坏的意思,那里面的资料怎么办呢,所以很多人很着急,其实遇到这种情况一般都是之前使用 ...
- sqli-labs less 1-4
sqli-labs less 1-4 数字型注入 当输入的参数为整形时,如果存在注入漏洞,可以认为是数字型注入. 测试步骤: (1) 加单引号,URL:www.text.com/text.php?id ...
- vue项目环境搭建
安装node.js $ npm install -g vue-cli $ vue init webpack my-project ?Project name ?Project description ...
- SCRUM 12.22
周一,大家现在课程也比较少,今天都在非常努力地写代码. 任务分配如往常一样,我们现在基本将工作的重心放在完善已有的组件上. 成员 任务 彭林江 落实API 牛强 落实意见反馈功能测试 高雅智 测试已完 ...
- Opentsdb 启动显示配置文件不存在
今天 重新启动opentsdb 出现本地配置文件不存在 这不知道 我查了一下官网 了解到 You can use the --config command line argument to s ...
- Sublime Text3前端必备插件
安装Package Control 在安装插件之前,需要让sublime安装Package Control.打开Sublime Text的控制台,快捷键ctrl + ~,在控制台中输入以下代码. im ...