社区讨论
55pts,悬关求调!
P2783有机化学之神偶尔会做作弊参与者 3已保存回复 4
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 4 条
- 当前快照
- 1 份
- 快照标识符
- @m4253ytv
- 此快照首次捕获于
- 2024/11/29 10:44 去年
- 此快照最后确认于
- 2025/11/04 13:41 4 个月前
两个tle,三个wa
CPP#include <bits/stdc++.h>
using namespace std;
const int maxn=1e4+5;
stack<int> st;
vector<int> g[maxn],tr[maxn];
int n,m,cnt,dfn[maxn],low[maxn];
int dep[maxn],ccnt,ccno[maxn],f[maxn][15];
void bcc(int v){
ccnt++;
int nw;
do{
nw=st.top();
st.pop();
ccno[nw]=ccnt;
}while(nw!=v);
}
void tarjan(int u,int fa){
st.push(u);
dfn[u]=low[u]=++cnt;
for(int v:g[u]){
if(!dfn[v]){
tarjan(v,u);
low[u]=min(low[u],low[v]);
if(dfn[u]<low[v]) bcc(v);
}else if(v!=fa) low[u]=min(low[u],dfn[v]);
}if(u==fa) bcc(u);
}
void dfs(int u,int fa){
f[u][0]=fa;
dep[u]=dep[fa]+1;
for(int v:tr[u])
if(v!=fa) dfs(v,u);
}
void bin(int num){
if(!num) return;
bin(num>>1);
putchar((num&1)+'0');
}
int lca(int u,int v){
if(dep[u]>dep[v]) swap(u,v);
for(int i=15;i>=0;i--)
if(dep[f[v][i]]>=dep[u]){
v=f[v][i];
if(dep[v]==dep[u]) break;
}
if(u==v) return u;
for(int i=log2(dep[v]);i>=0;i--)
if(f[u][i]!=f[v][i]){
u=f[u][i];
v=f[v][i];
}
return f[v][0];
}
int main(){
int u,v,tot;
scanf("%d%d",&n,&m);
while(m--){
scanf("%d%d",&u,&v);
g[u].push_back(v);
g[v].push_back(u);
}tarjan(1,1);
for(int i=1;i<=n;i++)
for(int j:g[i])
if(ccno[i]!=ccno[j]){
tr[ccno[i]].push_back(ccno[j]);
tr[ccno[j]].push_back(ccno[i]);
}
dfs(1,0);
for(int i=1;i<15;i++)
for(int u=1;u<=ccnt;u++)
f[u][i]=f[f[u][i-1]][i-1];
scanf("%d",&tot);
while(tot--){
scanf("%d%d",&u,&v);
int ca=lca(ccno[u],ccno[v]);
int ans=dep[ccno[u]]+dep[ccno[v]]-dep[ca]*2+1;
if(!ans) printf("0\n");
else{
bin(ans);
putchar('\n');
}
}
return 0;
}
回复
共 4 条回复,欢迎继续交流。
正在加载回复...