tarjan被#13 Hack 求调
查看原帖
tarjan被#13 Hack 求调
409774
Maysoul楼主2023/7/2 16:01
//2023/7/2
//别着急,先通读一遍题目
//别忘了开long long
//写完先看一遍怎么降复杂度
//要么开全局变量要么给定初值
//想想看,有什么情况需要特判
//看看数组开的够不够大
//std::ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
#include<bits/stdc++.h>
using namespace std;
const int MAXN=1e6+10;
int num;
int fa[MAXN],vis[MAXN];
vector<vector<int>> vec;
int head[MAXN];
map<pair<int,int>,int> mp;
struct linkstar{
	int to,from,w,next;
}edge[2*MAXN];
int escnt=0; 
void add(int from,int to)
{
	edge[++escnt].from=from;
	edge[escnt].to=to;
	edge[escnt].next=head[from];
	head[from]=escnt;
}
int find(int x)
{
	if(x==fa[x]) return x;
	else return fa[x]=find(fa[x]);
}
void lca(int x,int y)
{
	//cout<<x<<" "<<y<<" "<<find(y)<<endl;
	mp[make_pair(x,y)]=find(y);
	mp[make_pair(y,x)]=find(y);
}
void tarjan(int u)
{
	vis[u]=1;
	for (int i=head[u];i!=-1;i=edge[i].next){
		int v=edge[i].to;
		if(!vis[v]){
			tarjan(v);
			fa[v]=u;
		}
	}
	for (int i:vec[u]){
		if(vis[i]==2) lca(u,i);
	}
	vis[u]=2;
}
vector<pair<int,int>> ans;
int main()
{
	memset(head,-1,sizeof(head));
	int n,m,s,u,v;
	cin>>n>>m>>s;
	vec.resize(n+1);
	for (int i=1;i<=n-1;i++){
		cin>>u>>v;
		add(u,v);
		add(v,u);
		fa[i]=i;
	}
	fa[n]=n;
	for (int i=1;i<=m;i++){
		cin>>u>>v;
		ans.push_back(make_pair(u,v));
		vec[u].push_back(v);
		vec[v].push_back(u);
	}
	tarjan(s);
	for (int i=0;i<ans.size();i++){
		int u=ans[i].first;
		int v=ans[i].second;
		cout<<mp[make_pair(u,v)]<<'\n';
	}
	return 0;
}

2023/7/2 16:01
加载中...