Tarjan LCA

#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <vector>

using namespace std;

typedef long long ll;
typedef pair<int, int> P;

int n, m, s;

struct edge{
	int to, nxt;
}e[1000005];

int h[100005], cnt;

void addedge(int x, int y){
	cnt++; e[cnt].to = y; e[cnt].nxt = h[x]; h[x] = cnt;
	cnt++; e[cnt].to = x; e[cnt].nxt = h[y]; h[y] = cnt;
}

int vis[500005], fa[500005], ans[500005];
vector<P> v[500005];

int find(int x){
	return fa[x] == x ? x : fa[x] = find(fa[x]);
}

void merge(int x, int y){
	int xx = find(x), yy = find(y);
	fa[yy] = xx;
}

void Tarjan(int x, int f){
	vis[x] = 1;
	for(int i = h[x]; i; i = e[i].nxt){
		if(e[i].to == f) continue;
		Tarjan(e[i].to, x);
		merge(x, e[i].to);
	}
	for(int i = 0; i < v[x].size(); i ++){
		if(vis[v[x][i].first]){
			ans[v[x][i].second] = find(v[x][i].first);
		}
	}
}

int main(){
	scanf("%d%d%d", &n, &m, &s);
	for(int i = 1; i < n; i ++){
		int x, y;
		scanf("%d%d", &x, &y);
		addedge(x, y);
	}
	for(int i = 1; i <= m; i ++){
		int x, y;
		scanf("%d%d", &x, &y);
		v[x].push_back(make_pair(y, i));
		v[y].push_back(make_pair(x, i));
	}
	for(int i = 1; i <= n; i ++) fa[i] = i;
	Tarjan(s, 0);
	for(int i = 1; i <= m; i ++){
		printf("%d ", ans[i]);
	}
	return 0;
}
posted @ 2017-10-05 19:25  infinityedge  阅读(130)  评论(0)    收藏  举报