題目戳這裡
一句話題意
乙個無向圖,先縮掉所有的環,再詢問兩點直接隔了多少個點(兩端也算)。
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的軌道,能容納五對自旋相反的電子 共價鍵 性質 鍵長,越短,鍵越穩定。共價鍵的極性是因為成鍵的兩個原子...