洛谷2783 有機化學之神偶爾會做作弊

2022-04-29 20:03:12 字數 1800 閱讀 7546

題目戳這裡

一句話題意

乙個無向圖,先縮掉所有的環,再詢問兩點直接隔了多少個點(兩端也算)。

solution

似乎難度稱不上黑題,思路也很明顯

直接tarjan縮點後求lca,深度之差就是相隔的點數。

但注意特判lca=x或y的情況。

本來早就可以a了,結果居然lca打錯,無語...

可能難就難在**比較長,有點繞,但是想清楚還是蠻好打的。

也沒什麼好說的,直接看**吧。

coding

#includeusing namespace std;

const int n = 500005;

struct road

e[n*10];

int head[n],cnt,be[n],to[n],num[n];

void add(int x,int y)

int sum,color[n],low[n],ins[n],tim[n],sta[n],top=1,col;

void tarjan(int x,int last)

else if(ins[e[i].to]==1)

low[x]=min(low[x],tim[e[i].to]);}}

if(tim[x]==low[x])

while(sta[top]!=x);

}return ;

}int n,m,news[n],fa[n],lca[n][20],dep[n];

road edge[n*10];

void readd(int x,int y)

queueq;

bool lemon[n];

void dfs(int x,int deep,int last)

int lca(int x,int y)

if(x!=y)

else last=y;

if(popy==last) return dep[popx]-dep[last]+1;

else return dep[popx]-dep[last]+dep[popy]-dep[last]+1;

}void change(int num)

for(int i=cl;i>=1;i--)

printf("%d",ans[i]);

cout<>n>>m;

for(int i=1;i<=m;i++)

for(int i=1;i<=n;i++)

if(ins[i]==0) tarjan(i,i);

for(int i=1;i<=n;i++)

num[color[i]]++;

memset(head,0,sizeof(head));

cnt=0;

for(int i=1;i<=m;i++)

if(color[be[i]]!=color[to[i]]||(color[be[i]]==color[to[i]]&&num[color[be[i]]]==2))

dfs(1,1,1);

for(int i=1;i<=col;i++)

lca[i][0]=fa[i];

for(int j=1;j<=19;j++)

for(int i=1;i<=col;i++)

lca[i][j]=lca[lca[i][j-1]][j-1];

int t;

cin>>t;

for(int i=1;i<=t;i++)

return 0;

}

luogu P2783 有機化學之神偶爾會做作弊

嘟嘟嘟 一道很水的黑題 邊雙縮點後用lca求樹上兩點間路徑即可。但是比較坑的是這道題是忽略重邊的,結果我還特意考慮了重邊,然後wa了幾發。還有兩個點tle了,原因是建新圖的時候出現了重邊。這個重邊不是演算法的問題,因為邊雙縮點後不可能有重邊,而是寫法上的問題 在建無向邊的時候,習慣addedge x...

洛谷P2783 有機化學之神偶爾會做作弊

雖然感覺難度其實並不到黑題的難度 其實這道題並沒用什麼特別的知識,只是tarjan求雙聯通分量和lca的結合。所以,我們可以很顯然的發現 如此惡劣的詞彙,逃 這道題其實就是給你乙個無向圖,其中乙個點雙聯通分量算作乙個點,詢問兩個點之間 包括這兩個點 有多少點 注意重邊不需要縮點 注意這裡的圖是無向圖...

有機化學筆記

電子層和電子亞層的概念 如1s 2p 軌道,前面的數字代表電子層數。s亞層是角量子數l為1的軌道,能容納一對自旋相反的電子 p亞層是角量子數為2的軌道,能容納三對自旋相反的電子 d亞層是角量子數為3的軌道,能容納五對自旋相反的電子 共價鍵 性質 鍵長,越短,鍵越穩定。共價鍵的極性是因為成鍵的兩個原子...