死循球助!!!
查看原帖
死循球助!!!
317859
wangjingjie2022楼主2020/7/5 22:05
#include<iostream>
#include<algorithm>
using namespace std;
#define zql continue
const int maxn=1005;
const int maxm=50005;
int n,m,q,cnt;
int h[maxn],fa[maxn];
int vis[maxn],d[maxn],dis[maxn];
struct edge{
	int to,next,data;
}a[maxm*2];
struct K{
	int x,y,data;
}e[maxm];
bool cmp(K x,K y){
	return x.data>y.data;
}
void addedge(int x,int y,int z){
	a[++cnt].to=y;
	a[cnt].data=z;
	a[cnt].next=h[x];
	h[x]=cnt;
}
int getf(int x){
	while(x!=fa[x]) x=fa[x]=fa[fa[x]];
	return x;
}
void dfs(int x){
	vis[x]=1;
	for(int i=h[x];i;i=a[i].next)
		if(!vis[a[i].to]){
			fa[a[i].to]=x;
			dis[a[i].to]=a[i].data;
			d[a[i].to]=d[x]+1;
			dfs(a[i].to);
		}
}
void kruskal(){
	sort(e+1,e+m+1,cmp);
	for(int i=1;i<=m;i++){
		int u=getf(e[i].x);
		int v=getf(e[i].y);
		if(u!=v){
			fa[u]=v;
			addedge(e[i].x,e[i].y,e[i].data);
			addedge(e[i].y,e[i].x,e[i].data);
		}
	}
}
int lca(int x,int y){
	if(getf(x)!=getf(y))return -1;
	int minn=0x3f3f3f3f;
	if(d[x]<d[y])swap(x,y);
	while(d[x]>d[y]){
		y=fa[y];
		minn=min(minn,dis[y]);
	}
	while(x!=y){
		minn=min(minn,dis[x]);
		minn=min(minn,dis[y]);
		x=fa[x];
		y=fa[y];
	}
	return minn;
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++)fa[i]=i;
	for(int i=1;i<=m;i++)cin>>e[i].x>>e[i].y>>e[i].data;
	kruskal();
	dfs(1);
	cin>>q;
	for(int i=1;i<=q;i++){
		int x,y;
		cin>>x>>y;
		cout<<lca(x,y)<<"\n";
	}
}
2020/7/5 22:05
加载中...