社区讨论
本人刚学OI,此题过了4个点,剩下的answer too long
P2783有机化学之神偶尔会做作弊参与者 5已保存回复 7
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 7 条
- 当前快照
- 1 份
- 快照标识符
- @mi6yogsy
- 此快照首次捕获于
- 2025/11/20 12:58 4 个月前
- 此快照最后确认于
- 2025/11/20 12:58 4 个月前
CPP
#include<bits/stdc++.h>
using namespace std;
long long n,m,q,root;
bool bridge[100010];
long long num,dfn[10010],low[10010];
long long c[10010],dcc,ans[10010];
long long fa[10010],d[10010],v[10010],lca[10010];
vector<long long>query[10010],query_id[10010];
struct node{
long long to,next;
}edge[100010],edge_c[100010];
int first[10010],first_c[10010],cnt=1,cnt_c;
void add(long long u,long long v){
edge[++cnt].to = v;
edge[cnt].next = first[u];
first[u] = cnt;
}
void add_c(long long u,long long v){
edge_c[++cnt_c].to = v;
edge_c[cnt_c].next = first_c[u];
first_c[u] = cnt_c;
}
void add_query(long long x,long long y,long long id){
query[x].push_back(y),query_id[x].push_back(id);
query[y].push_back(x),query_id[y].push_back(id);
}
long long get(long long x){return fa[x]==x?x:fa[x]=get(fa[x]);}
void TJ_C(long long x,long long in){
dfn[x] = low[x] = ++num;
for(long long i = first[x];i;i = edge[i].next){
long long y = edge[i].to ;
if(!dfn[y]){
TJ_C(y,i);
low[x] = min(low[x],low[y]);
if(low[y]>dfn[x]){
bridge[i] = bridge[i^1]=1;
}
}
else if(i!=(in^1))low[x]=min(low[x],dfn[y]);
}
}
void dfs(long long x){
c[x] = dcc;
for(long long i =first[x];i;i=edge[i].next){
long long y = edge[i].to;
if(c[y]||bridge[i])continue;
dfs(y);
}
}
void TJ_LCA(long long x){
v[x] = 1;
for(long long i = first_c[x];i;i = edge_c[i].next){
long long y = edge_c[i].to;
if(v[y])continue;
d[y] = d[x]+1;
TJ_LCA(y);
fa[y] = x;
}
for(long long i = 0;i < query[x].size(); i++){
long long y = query[x][i],id = query_id[x][i];
if(v[y]==2){
long long LCA = get(y);
ans[id] = min(ans[id],d[x]+d[y]-2*d[LCA]+1);
}
}
v[x] = 2;
}
void output(int x){
if(x){
output(x>>1);
printf(x&1?"1":"0");
}
}
int main(){
scanf("%lld%lld",&n,&m);
for(long long i = 1; i <= m; i++){
long long x,y;
scanf("%lld%lld",&x,&y);
add(x,y);add(y,x);
}
scanf("%lld",&q);
// for(int i = 1; i <= q; i++)scanf("%d%d",&X[i],&Y[i]);
for(long long i = 1; i <= n; i++)if(!dfn[i])TJ_C(i,0);
for(long long i = 1; i <= n; i++)if(!c[i]){dcc++;dfs(i);}
for(long long x = 1; x <= n; x++ )
for(long long i = first[x];i;i=edge[i].next){
long long y = edge[i].to;
if(c[x]==c[y])continue;
add_c(c[x],c[y]);
}
for(long long i = 1; i <= n; i++)fa[i]=i;
for(long long i = 1; i <= q; i++){
long long x,y;
scanf("%lld%lld",&x,&y);
if(x==y)ans[i] = 0;
else{
add_query(x,y,i);
ans[i]=1<<29;
}
}
TJ_LCA(1);
for(long long i = 1; i <= q; i++){
output(ans[i]);
printf("\n");
}
}
回复
共 7 条回复,欢迎继续交流。
正在加载回复...