抽象 Tarjan 求调,样例挂了
查看原帖
抽象 Tarjan 求调,样例挂了
956382
Ravener楼主2024/8/4 21:39
#include <bits/stdc++.h>
#define ll long long
#define il inline
#define rt return
#define N 500005

using namespace std;

il int read()
{
	int x=0,f=1;
	char c=getchar();
	while(c<'0'||c>'9')
	{
		if(c=='-') f=-1;
		c=getchar();
	}
	while(c>='0'&&c<='9')
	{
		x=(x<<1)+(x<<3)+(c^48);
		c=getchar();
	}
	rt x*f;
}
il void print(int a)
{
	if(a<0) putchar('-'),a=-a;
	if(a/10) print(a/10);
	putchar(a%10+48);
}

struct dsu//继承了 OI-wiki 中并查集的作风(bushi)
{
	vector<size_t>pa,size;
	explicit dsu(size_t size_):pa(size_),size(size_,1)
	{
		iota(pa.begin(),pa.end(),0);
	}
	size_t find(size_t x){rt pa[x]==x?x:pa[x]=find(pa[x]);}
	void unite(size_t x,size_t y)
	{
		x=find(x),y=find(y);
		if(x==y) rt;
		if(size[x]<size[y]) swap(x,y);
		pa[y]=x;
		size[x]+=size[y];
	}
};
struct Edge
{
	int from,to;
	int nxt;
	int LCA;
	Edge():from(-1),to(-1),nxt(-1),LCA(-1){};
	Edge(int u,int v,int w):
	from(u),to(v),nxt(w),LCA(-1){}
}edge[N<<1],qed[N<<1];
int hd[N],qhd[N];
bool vis[N];
int n,m,s;
int cnt=-1,cnt2=-1;
void add(int x,int y)
{
	edge[++cnt]=Edge(x,y,hd[x]);
	hd[x]=cnt;
}
void sdd(int x,int y)
{
	qed[++cnt2]=Edge(x,y,qhd[x]);
	qhd[x]=cnt2;
}
void tarjan(dsu d,int u)
{
	vis[u]=1;
	for(int i=hd[u];i!=-1;i=edge[i].nxt)
	{
		Edge &e=edge[i];
		if(!vis[e.to])
		{
			tarjan(d,e.to);
			d.unite(u,e.to);
		}
	}
	for(int i=qhd[u];i!=-1;i=qed[i].nxt)
	{
		Edge &e=qed[i];
		if(vis[e.to])
			qed[i^1].LCA=e.LCA=d.find(e.to);
	}
}
void init()
{
	memset(hd,0xff,sizeof(hd));
	memset(qhd,0xff,sizeof(qhd));
}
int main()
{
	n=read(),m=read(),s=read();
	dsu d(n+3);
	init();
	for(int i=1;i<n;i++)
	{
		int u=read(),v=read();
		add(u,v),add(v,u);
	}
	for(int i=1;i<=m;i++)
	{
		int u=read(),v=read();
		sdd(u,v),sdd(v,u);
	}
	tarjan(d,s);
	for(int i=0;i<m;i++)
	{
		Edge &e=qed[i<<1];
		print(e.LCA);
		puts("");
	}
}
2024/8/4 21:39
加载中...