95分第16个点挂了,kruskal+LCA求调
查看原帖
95分第16个点挂了,kruskal+LCA求调
593921
黄海辰楼主2024/4/15 21:34
#include<bits/stdc++.h>
#define int long long
using namespace std;
int vis[1000005],q,n,m,cnt,p,h2[1000005],s,lg[500005],d[500005],f[500005][20],h[1000001],mn[500005][20];
struct node
{
	int u,v,w;
} aaa[1000500];
bool cmpp(node a,node b)
{
	return a.w>b.w;
}
int fff[1000505];
int find(int x)
{
	if(x==fff[x])
		return x;
	return fff[x]=find(fff[x]);
}
void merge(int x,int y)
{
	int fx=find(x),fy=find(y);
	fff[fy]=fx;
}
struct pj
{
	int v,w;
	int nxt;
} e[1000001];
void add(int u,int v,int w)
{
	e[++cnt].v=v;
	e[cnt].w=w;
	e[cnt].nxt=h[u];
	h[u]=cnt;
}
void dfs(int x,int fa,int w)
{
	vis[x]=1;
	int v,u;
	f[x][0]=fa;
	mn[x][0]=w;
	d[x]=d[fa]+1;
	for(int i=1; i<=lg[d[x]]; i++)
	{
		f[x][i]=f[f[x][i-1]][i-1];
		mn[x][i]=min(mn[x][i],min(mn[x][i-1],mn[f[x][i-1]][i-1]));
	}
	for(int i=h[x]; i; i=e[i].nxt)
	{
		v=e[i].v;
		if(v!=fa)
			dfs(v,x,e[i].w);
	}
}
int LCA(int x,int y)
{
	if(find(x)!=find(y))return -1;
	if(d[x]<d[y])swap(x,y);
	int ans=1e17;
	while(d[x]>d[y])
	{
		ans=min(ans,mn[x][lg[d[x]-d[y]]]);
		x=f[x][lg[d[x]-d[y]]];
	}
	if(x==y)return ans;
	for(int k=lg[d[x]]; k>=0; --k)
		if(f[x][k]!=f[y][k])
		{
			ans=min(ans,min(mn[x][k],mn[y][k]));
			x=f[x][k],y=f[y][k];
		}
	ans=min(ans,min(mn[x][0],mn[y][0]));
	return ans;
}

signed main()
{
	memset(mn,0x3f,sizeof(mn));
	cin>>n>>m;
	for(int i=1; i<=m; i++)
	{
		cin>>aaa[i].u>>aaa[i].v>>aaa[i].w;
	}
	sort(aaa+1,aaa+m,cmpp);
	for(int i=1; i<=n; i++)fff[i]=i;
	for(int i=1; i<=m; i++)
	{
		int fx=find(aaa[i].u),fy=find(aaa[i].v),w=aaa[i].w;
		if(fx!=fy)
		{
			merge(fx,fy);
			add(aaa[i].u,aaa[i].v,w);
			add(aaa[i].v,aaa[i].u,w);
		}
	}
	lg[1]=0;
	for(int i=2; i<=n; i++)
		lg[i]=lg[i/2]+1;
	for(int i=1; i<=n; i++)
	{
		if(vis[i]==0)
			dfs(i,i,1e17);
	}
	cin>>q;
	for(int i=1; i<=q; i++)
	{
		int a,b;
		cin>>a>>b;
		cout<<LCA(a,b)<<"\n";
	}
	return 0;
}

就错一个点!!!!!

2024/4/15 21:34
加载中...