我连输入都不会
查看原帖
我连输入都不会
782210
Yu_Chengxuan楼主2024/8/6 08:30
#include <bits/stdc++.h>
using namespace std;

inline int read() {
	int x=0,f=1;
	char ch=getchar();
	while (ch<'0'||ch>'9') {
		if (ch=='-') f=-1;
		ch=getchar();
	}
	while (ch>='0'&& ch<='9') {
		x=x*10+ch-48;
		ch=getchar();
	}
	return x*f;
}

const int maxn=400010;
struct edge{
	int u,v,w;
}a[maxn];
bool cmp(edge a,edge b){
	return a.w>b.w;
}
struct node{
	int v;
	int w;
};
int n,m,sum;
vector<node> e[maxn]; 
int fa[maxn],w[maxn];
int deep[maxn],jump[maxn][25];
int dis[maxn],val[maxn][25];

int find(int k){
	if(fa[k]==k) return k;
	return fa[k]=find(fa[k]);
}
void kruskal(){
	sort(a+1,a+m+1,cmp);
	for (int i=1;i<=n;i++){
		fa[i]=i;
	}
	for (int i=1;i<=m;i++){
		if (find(a[i].u) != find(a[i].v)){
			int x=a[i].u,y=a[i].v;
			e[y].push_back(node{x,a[i].w});
			e[x].push_back(node{y,a[i].w}); 
			fa[find(a[i].u)] = find(a[i].v);
		}
	}
}
void dfs(){
	memset(deep,0x3f,sizeof(deep));
	deep[0]=0;
	deep[1]=1;
	queue<int> q; 
	q.push(1);
	val[1][0]=0x3f3f3f3f;
	while (!q.empty()){
		int x = q.front();
		q.pop();
		for (node y : e[x]){
			int i=y.v;
			if (deep[i]<deep[x]){
				continue;
			}
			q.push(i);
			deep[i] = deep[x]+1;
			val[i][0]=y.w;
			jump[i][0]=x;
			for (int j=1;j<=22;j++){
				jump[i][j]=jump[jump[i][j-1]][j-1];
				val[i][j]=min(val[i][j-1],val[jump[i][j-1]][j-1]);
			} 			
		}
	}
}
int lca(int a,int b){
	if (fa[a]!=fa[b]) return -1;
	int ans=0x3f3f3f3f3f3f3f3f;
	if(deep[a]<deep[b]) swap(a,b);
	for (int i=20;i>=0;i--){
		if (deep[jump[a][i]]>=deep[b]){
			ans=min(ans,val[a][i]);
			a=jump[a][i];
		}
	}
	if(a==b) return ans;
	for (int i=20;i>=0;i--){
		if (jump[a][i]!=jump[b][i]){
			ans=min(ans,min(val[a][i],val[b][i]));
			a=jump[a][i];
			b=jump[b][i];
		}
	}
	ans=min(ans,min(val[a][0],val[b][0]));
	return ans;
}
int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=m;i++){
		scanf("%d%d%d",&a[i].u,&a[i].v,&a[i].w);
	}
	memset(val,0x3f,sizeof(val));
	kruskal();
	dfs();
	int q;
	scanf("%d",&q);
    for(int i=1; i<=q; i++){
        int x,y;
        scanf("%d%d",&x,&y);
        cout << lca(x,y);
    }	
	return 0;
}

在这个数据有输入问题

5 4

1 2 1

1 3 1

2 3 1

4 5 5

1

4 5

2024/8/6 08:30
加载中...