0pts求调!!!
查看原帖
0pts求调!!!
431000
xindlantern楼主2024/1/8 17:00
```cpp
#include<bits/stdc++.h>
using namespace std;

const int N=10005,M=50005,INF=0x3f3f3f3f;

struct Edge{
	int x,y,z;
	bool operator < (const Edge &t) const{
		return z>t.z;
	}
}edge[M];

int n,m,q;
int h[N],e[M<<1],ne[M<<1],w[M<<1],idx;
int fa[N][18],dep[N],res[N][18];
int p[N];
bool vis[N];

int find(int x){
	if(x!=p[x]) return p[x]=find(p[x]);
	return x;
} 

void add(int a,int b,int c){
	e[idx]=b,w[idx]=c,ne[idx]=h[a],h[a]=idx++;
}

void dfs(int u,int f,int val){
	vis[u]=1;dep[u]=dep[f]+1,fa[u][0]=f,res[u][0]=val;
	for(int i=1;i<=18;++i){
		fa[u][i]=fa[fa[u][i-1]][i-1];
		res[u][i]=min(res[u][i-1],res[fa[u][i-1]][i-1]);
	}
	for(int i=h[u];~i;i=ne[i]){
		int v=e[i];
		if(v==f) continue;
		dfs(v,u,w[i]);
	}
}

int LCA(int x,int y){
	if(find(x)!=find(y)) return -1;
	int ans=INF;
	if(dep[x]<dep[y]) swap(x,y);
	for(int i=18;i>=0;i--)
		if(dep[fa[x][i]]>=dep[y]){
			ans=min(ans,res[x][i]);
			x=fa[x][i];
		}
	if(x==y) return ans;
	for(int i=18;i>=0;i--)
		if(fa[x][i]!=fa[y][i]){
			ans=min(res[y][i],min(ans,res[x][i]));
			x=fa[x][i];y=fa[y][i];
		}
	ans=min(ans,min(res[x][0],res[y][0]));
	return ans;
}

int main(){
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0);
	cin>>n>>m;
	for(int i=1;i<=m;++i)
		cin>>edge[i].x>>edge[i].y>>edge[i].z;
	sort(edge+1,edge+1+m);
	for(int i=1;i<=n;++i) p[i]=i;
	memset(h,-1,sizeof h);
	for(int i=1;i<=m;++i){
		int px=find(edge[i].x),py=find(edge[i].y);
		if(px!=py){
			p[px]=py;
			add(edge[i].x,edge[i].y,edge[i].z);
			add(edge[i].y,edge[i].x,edge[i].z);
		}
	}
	for(int i=1;i<=n;++i){
		if(!vis[i])
			dfs(i,0,INF);
	}
	cin>>q;
	for(int i=1;i<=q;++i){
		int x,y;
		cin>>x>>y;
		cout<<LCA(x,y)<<"\n";
	}
	for(int i=1;i<=n;++i){
		for(int j=0;j<=5;++j)
			cout<<res[i][j]<<" ";
		cout<<"\n";
	}
	return 0;
}
2024/1/8 17:00
加载中...