不太清楚的小问题
查看原帖
不太清楚的小问题
558049
_Tea楼主2025/6/29 16:10
#include <bits/stdc++.h>
using namespace std;
#define rint register int
#define F(i, x, y) for (rint i = (x); i <= (y); i++)
#define DF(i, x, y) for (rint i = (x); i >= (y); i--)
#define LL unsigned long long
#define PII pair<int,int>
#define x first
#define y second
const int N = 5e5+10,inf = 0x3f3f3f3f;
int n,m,s;
int dep[N],f[N][20]; 
vector<int> G[N];

int rd()
{
    int x = 0; int f = 1; char c = getchar();
    for (; !isdigit(c); c = getchar()) if (c == '-') f = - 1;
    for (; isdigit(c); c = getchar()) x = (x << 1) + (x << 3) + (c ^ 48);
    return x *= f;
}

void pt(int x)
{
	if(x < 0)putchar('-'),x = -x;
	if(x <= 9)putchar(x + '0');
	else
	{
		pt(x / 10);
		putchar(x % 10 + '0');
	}
}

void dfs(int u,int fa)
{
	for(int i=0;i<G[u].size();i++)
	{
		int v=G[u][i];
		if(v==fa)continue;
		dep[v] = dep[u]+1;
		f[v][0] = u;
		dfs(v,u);
	}
}

int LCA(int x,int y)
{
	if(dep[x]<dep[y])swap(x,y);
	for(int i=18;i>=0;i--)
	  if(dep[f[x][i]]>=dep[y])
	    x=f[x][i];
	if(x==y)return x; 
	for(int i=18;i>=0;i--)
	  if(f[x][i]!=f[y][i])
	    x=f[x][i],y=f[y][i];
	return f[x][0];
}


signed main()
{
	cin>>n>>m>>s;
	F(i,1,n-1)
	{
		int u,v;
		cin>>u>>v;
		G[u].push_back(v);
		G[v].push_back(u); 
	}
	dep[s] = 1; //为何此处深度改为0就WA???
	dfs(s,-1);
	for(int k=1;k<=18;k++)
	  for(int i=1;i<=n;i++)
	    f[i][k] = f[f[i][k-1]][k-1];
	while(m--)
	{
		int a,b;cin>>a>>b;
		if(a==b){
			pt(a);puts("");
		}
		else {
		  pt(LCA(a,b));puts(""); 
		}

	}
	return 0;
}

如上,写成dep[s]=0就WA了,不太理解

2025/6/29 16:10
加载中...