社区讨论

本人刚学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 条回复,欢迎继续交流。

正在加载回复...