hihocoder1067 离线LCA

本文介绍了一个基于图论的算法实现,通过使用C++语言构建了复杂的图数据结构,并实现了节点间的连接查找功能。该算法利用深度优先搜索进行图遍历,并通过并查集处理节点间的连通性问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <cstdio>
#include <iostream>
#include <map>
#include <vector>
using namespace std;
map<string,int> ma;
string sttr[200006];

vector<int> vec[200005];
vector<int> mat[200005];
vector<int> all[200005];
map<int,pair<int,int> > ans;
int vis[200005];
int cnt = 1;

int n,m;
int fa[200005];
int find(int x){
	return x == fa[x] ? x: fa[x] = find(fa[x]); 
}
string solve(int a,int b){
	int si = all[a].size();
	
	for(int i = 0;i < si;i++){
		if(mat[a][i] == b && all[a][i]){
			return sttr[all[a][i]];
		}
	}
	si = all[b].size();
	for(int i  = 0;i < si;i++){
		if(mat[b][i] == a && all[b][i]){
			return sttr[all[b][i]];
		}
	}
}
void dfs(int u){
	vis[u] = 1;
	int si = vec[u].size();
	for(int i = 0;i < si;i++){
		int v = vec[u][i];
		if(!vis[v]){
			dfs(v);
		}
		fa[v] = u;
	}
	vis[u] = 2;
	si = all[u].size();
	for(int i = 0;i < si;i++){
		int v = mat[u][i];
		if(vis[v] == 2) 
			all[u][i] = find(v);
	}
}
int main(){
	cin >> n;
	for(int i = 0;i < n;i++){
		string a,b;
		cin >> a >> b;
		if(ma[a] == 0){
			sttr[cnt] = a;
			
			ma[a] = cnt++;
		}
		if(ma[b] == 0){
			sttr[cnt] = b;
			ma[b] = cnt++;
		}
		int x,y;
		x = ma[a];
		y = ma[b];
		vec[x].push_back(y);
	}
	cin >> m;
	for(int i = 1;i <= m;i++){
		string a,b;
		cin >> a >> b;
		int x,y;
		x = ma[a];
		y = ma[b];
		mat[x].push_back(y);
		all[x].push_back(0);
		mat[y].push_back(x);
		all[y].push_back(0);
		ans[i] = make_pair(x,y);
	} 
	for(int i = 1;i <= cnt;i++){
		fa[i] = i;
	}
	dfs(1);
	for(int i = 1;i <= m;i++){
		cout << solve(ans[i].first,ans[i].second) << endl; 
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值