求助题目(最大生成树+LCA)
查看原帖
求助题目(最大生成树+LCA)
467616
osky123456楼主2022/3/6 17:34

最大生成树的锅导致RE,但是查不出来错在哪里,求指教

#include<bits/stdc++.h>
#define maxn 100001
using namespace std;
int n,m,fa[maxn],head[maxn],vis[maxn],ct,cnt,p[maxn][25],lg[maxn],dep[maxn],dis[maxn][1001];
struct Edge{
	int u,v,w,next;
}e[maxn],edge[maxn<<1];
inline void add(int u,int v,int w){
	e[++cnt].u=u;
	e[cnt].v=v;
	e[cnt].w=w;
}
inline void add_edge(int u,int v,int w){
	edge[++ct].u=u;
	edge[ct].v=v;
	edge[ct].next=head[u];
	head[u]=ct;
}
int find (int x){return fa[x]==x?x:fa[x]=find(x);}
bool cmp(Edge a,Edge b){return a.w>b.w;}
void Krusal(){
	sort(e+1,e+1+m,cmp);
	int num=0;
	for(int i=1;i<=cnt;++i){
		int fx=find(e[i].u),fy=find(e[i].v);
		if(fx!=fy){
			fa[fx]=fy;
			add_edge(e[i].u,e[i].v,e[i].w);
			add_edge(e[i].v,e[i].u,e[i].w);
			if(++num==n) return ;
		}
	}
}
void dfs(int u,int fa,int w){
	vis[u]=1;
	p[u][0]=fa;
	dep[u]=dep[fa]+1;
	dis[u][0]=w;
	for(int i=1;(1<<i)<=dep[u];++i){
		p[u][i]=p[p[u][i-1]][i-1];
		dis[u][i]=min(dis[u][i-1],dis[p[u][i-1]][i-1]);
	}
	for(int i=head[u];i;i=e[i].next){
		if(edge[i].w!=fa) dfs(edge[i].v,u,edge[i].w);
	}
}
int lca(int x,int y){
	if(find(x)!=find(y)) return -1;
	int ans=210000000;
	if(dep[x]<dep[y]) swap(x,y);
	while (dep[x] > dep[y]) {
		ans = min(ans, dis[x][lg[dep[x] - dep[y]] - 1]);
		x = p[x][lg[dep[x] - dep[y]] - 1];
	}
	if(x==y) return x;
	for (int i = lg[dep[x]] - 1; i >= 0; i--) {
		if (p[x][i] != p[y][i]) {
			ans = min(ans, dis[x][i]);
			ans = min(ans, dis[y][i]);
			x = p[x][i];
			y = p[y][i];
		}
	}
	ans = min(ans, min(dis[x][0], dis[y][0]));
	return ans;
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;++i) fa[i]=i;
	for(int i=1;i<=m;++i){
		int u,v,w;
		cin>>u>>v>>w;
		add(u,v,w);
	} 
	int q;
	cin>>q;
	Krusal();
	return 0;
	for(int i=1;i<=n;++i) if(!vis[i]) dfs(i,0,0);
	for (int i = 1; i <= n; i++) lg[i] = lg[i - 1] + (1 << lg[i - 1] == i);
	for(int i=1;i<=q;++i){
		int u,v;
		cin>>u>>v;
		cout<<lca(u,v)<<endl;
	}
	return 0;
}
2022/3/6 17:34
加载中...