【题解】Luogu P2783 有机化学之神偶尔会做作弊
生活随笔
收集整理的這篇文章主要介紹了
【题解】Luogu P2783 有机化学之神偶尔会做作弊
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
原題鏈接:P2783 有機(jī)化學(xué)之神偶爾會(huì)做作弊
一看,是黑題,太毒瘤了,不寫(xiě)
什么單鏈??!
只會(huì)畫(huà)有機(jī)化學(xué)中正六邊形的我覺(jué)得這樣不行QAQ(我才初二)
當(dāng)然,題目也給你了詳細(xì)的解釋
實(shí)際呢,這道題先給你了一個(gè)圖,讓你把圖中的環(huán)全縮成一個(gè)點(diǎn),在求兩個(gè)點(diǎn)之間的距離
這道題估計(jì)是你谷最簡(jiǎn)單黑題
先用tarjan縮點(diǎn),再重新建圖
在新建的圖上跑lca求距離
就是這么簡(jiǎn)單
代碼上有些細(xì)節(jié)需要注意
#pragma GCC optimize("O3") #define N 100001 #include <bits/stdc++.h> using namespace std; inline int read() {register int f=1,x=0;register char ch;do{ch=getchar();if(ch=='-')f=-1;}while(ch<'0'||ch>'9');do{x=x*10+ch-'0';ch=getchar();}while(ch>='0'&&ch<='9');return f*x; } inline int Min(register int a,register int b) {if(a<b)return a;return b; } inline void Swap(register int &a,register int &b) {a^=b^=a^=b; } int tmp[64]; inline void print(register int res) {if(res==0) {puts("0");return;}if(res<0) {putchar('-');res=0-res;}while(res) tmp[++tmp[0]]=res&1,res>>=1;while(*tmp) putchar(tmp[(*tmp)--]+'0');putchar('\n'); } int n,m,tot,q,sign,top,cnt; int first[N<<1][2],next[N<<1][2],to[N<<1][2],dfn[N],low[N],sta[N],id[N],dep[N]; int p[N][50],xx[N],yy[N]; bool insta[N]; inline void ADD(register int x,register int y,register int w) {next[++tot][w]=first[x][w];to[tot][w]=y;first[x][w]=tot; } inline void add(register int x,register int y,register int w) {ADD(x,y,w);ADD(y,x,w); } inline void DFS(register int x,register int fa) {dfn[x]=low[x]=++sign;sta[++top]=x;insta[x]=true;int k=first[x][0],u;while(k){u=to[k][0];if(u==fa){k=next[k][0];continue;}if(!dfn[u]){DFS(u,x);low[x]=Min(low[u],low[x]);}else if(insta[u])low[x]=Min(low[x],dfn[u]);k=next[k][0];}if(low[x]==dfn[x]){++cnt;while(19260817){int y=sta[top--];id[y]=cnt;if(x==y)break;}}return; } inline void rebuild() {tot=0;for(register int i=1;i<=m;++i)if(id[xx[i]]!=id[yy[i]])add(id[xx[i]],id[yy[i]],1); } inline void DFS2(register int son,register int fa) {dep[son]=dep[fa]+1;p[son][0]=fa;for(register int i=first[son][1];i;i=next[i][1])if(to[i][1]!=fa)DFS2(to[i][1],son); } inline int LCA(register int a,register int b) {if(a==b)return a;if(dep[a]>dep[b])Swap(a,b);for(register int i=20;i>=0;--i)if(dep[p[b][i]]>=dep[a])b=p[b][i];if(a==b)return a;for(register int i=20;i>=0;--i)if(p[a][i]!=p[b][i])a=p[a][i],b=p[b][i];return p[a][0]; } int main() {n=read(),m=read();for(register int i=1;i<=m;++i){xx[i]=read(),yy[i]=read();add(xx[i],yy[i],0);}for(register int i=1;i<=n;++i)if(!dfn[i])DFS(i,0);rebuild();DFS2(1,0); for(register int i=1;i<=20;++i)for(register int j=1;j<=cnt;++j)p[j][i]=p[p[j][i-1]][i-1];q=read();while(q--){int a=read(),b=read();a=id[a],b=id[b];int lca=LCA(a,b),ans=0;ans=dep[a]+dep[b]-(dep[lca]<<1)+1;print(ans);}return 0; }轉(zhuǎn)載于:https://www.cnblogs.com/yzhang-rp-inf/p/9715888.html
總結(jié)
以上是生活随笔為你收集整理的【题解】Luogu P2783 有机化学之神偶尔会做作弊的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: java集合(4)-Set集合
- 下一篇: Bootstrap+PHP filein