Kruskal+LCA 样例 WA 求条(悬关)
查看原帖
Kruskal+LCA 样例 WA 求条(悬关)
946515
66xyyd楼主2024/1/18 20:24

没查出来哪里错了,样例输出:

0
-1
0

代码(链式前向星存图):

#include<iostream>
#include<algorithm>
using namespace std;
struct graph{
	struct edge{
		int u,v,w,nxt;
	}e[1000001];
	int head[10001],cnt=1;
}g1,g2;
int n,m,q;
void add(graph &g,int u,int v,int w){
	g.e[g.cnt]=graph::edge({u,v,w,g.head[u]});
	g.head[u]=g.cnt++;
}
int fa[10001];
int find(int x){
	if (fa[x]==x){
		return x;
	}
	return fa[x]=find(fa[x]);
}
void merge(int x,int y){
	x=find(x),y=find(y);
	fa[y]=x;
}
bool query(int x,int y){
	x=find(x),y=find(y);
	return fa[x]==fa[y];
}
void kruskal(graph &input,graph &ans){
	for(int i=1;i<=n;i++){
		fa[i]=i;
	}
	sort(input.e+1,input.e+m+1,[](const graph::edge &lhs,const graph::edge &rhs){
		return lhs.w>rhs.w;
	});
	for(int i=1;i<=m;i++){
		cout << "get path: <" << input.e[i].u << ", " << input.e[i].v << ">.\n";
		if(query(input.e[i].u,input.e[i].v))	continue;
		merge(input.e[i].u,input.e[i].v);
		add(ans,input.e[i].u,input.e[i].v,input.e[i].w);
		add(ans,input.e[i].v,input.e[i].u,input.e[i].w);
	}
}
int dis[10001],dep[10001];
bool vis[10001];
int parent[10001][20],weight[10001][20];
void dfs(int i){
//	cout << "dfs id: " << i << ".\n";
	for(int j=g2.head[i];j;j=g2.e[j].nxt){
		int to=g2.e[j].v,len=g2.e[j].w;
		if(vis[to])	continue;
		vis[to]=true;
		dis[to]=min(dis[i],len);
		dep[to]=dep[i]+1;
		parent[to][0]=i;
		weight[to][0]=len;
		dfs(to);
	}
}
void lca_pre(){
	for(int j=1;(1<<j)<=n;j++){
		for(int i=1;i<=n;i++){
			parent[i][j]=parent[parent[i][j-1]][j-1];
			weight[i][j]=min(weight[i][j-1],weight[parent[i][j-1]][j-1]);
		}
	}
}
int lca(int a,int b){
	if(dep[a]<dep[b])	swap(a,b);
	int ans=2147483647;
	//a的深度比b大,提升a的深度
	int i=-1,j;
	while((1<<(i+1))<=dep[b])	++i;
	for(j=i;j>=0;--j){
		if(dep[a]-(1<<j)>=dep[b]){
			ans=min(ans,weight[a][j]);
			a=parent[a][j];
		}
	}
	if(a==b)	return a;
	for(j=i;j>=0;--j){
		if(parent[a][j]!=parent[b][j]){
			ans=min(ans,min(weight[a][j],weight[b][j]));
			a=parent[a][j],b=parent[b][j];
		}
	}
	ans=min(ans,min(weight[a][0],weight[b][0]));
	return ans;
}
int main(){
	cin >> n >> m;
	for(int i=1;i<=m;i++){
		int u,v,w;
		cin >> u >> v >> w;
		add(g1,u,v,w);
		add(g1,v,u,w);
	}
	kruskal(g1,g2);
//	cout << "end kruskal.\n";
	for(int i=1;i<=n;i++){
		if(!vis[i]){
			vis[i]=true;
//			cout << "search id:" << i << ".\n";
			dfs(i);
		}
	}
//	cout << "start lca_pre.\n";
	lca_pre();
//	cout << "end lca_pre.\n";
	cin >> q;
	while(q--){
		int a,b;
		cin >> a >> b;
		if(query(a,b)==false){
			cout << "-1\n";
		} else{
			cout << lca(a,b) << '\n';
		}
	}
	return 0;
}
2024/1/18 20:24
加载中...