求助
查看原帖
求助
1250425
Leying楼主2024/1/4 21:44

样例未过,人要调傻了

#include <bits/stdc++.h>
#define int long long
using namespace std;

const int N=1e5+5;
const int inf=0x3f3f3f3f;

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

int n,m;
struct edge{
	int to,w;
};
struct mst{
	int u,v,w;
}e[N];
vector <edge> G[N]; 
int f[N];
int find(int x){
	if(x==f[x])return x;
	return f[x]=find(f[x]);
}
bool cmp(mst A,mst B){
	return A.w>B.w;
}
void kruskal(){
	int tmp=0;
	sort(e+1,e+m+1,cmp);
	for(int i=1;i<=n;i++)f[i]=i;
	for(int i=1;i<=m;i++){
		int u=e[i].u,v=e[i].v,w=e[i].w;
		int fu=find(u),fv=find(v);
		if(fu!=fv){
			G[u].push_back(edge{v,w});
			G[v].push_back(edge{u,w});
			f[fv]=fu;
//			cout<<u<<' '<<v<<"\n";
			tmp++;
		}
		if(tmp==n-1)break;
	}
}

int up[N][16],dis[N][16],dep[N],lg[N];
void Dfs(int x,int fa,int w){
	up[x][0]=fa,dis[x][0]=w,dep[x]=dep[fa]+1;
	int L=lg[dep[x]];
	for(int i=1;i<=L;i++){
		up[x][i]=up[up[x][i-1]][i-1];
		dis[x][i]=min(dis[x][i-1],dis[up[x][i-1]][i-1]);	
	}
	for(int i=0;i<G[x].size();i++){
		int y=G[x][i].to;
		if(y==fa)continue;
		Dfs(y,x,G[x][i].w);
	}
}
int Query(int x,int y){
	int ans=inf;
	if(dep[x]<dep[y])swap(x,y);
	int L=lg[dep[x]];
	for(int i=L;i>=0;i--){
		if(dep[x]-(1<<i)>=dep[y]){
			x=up[x][i];
			ans=min(ans,dis[x][i]);
		}
	}
	if(x==y)return ans;
	L=lg[dep[x]];
	for(int i=L;i>=0;i--){
		if(up[x][i]!=up[y][i]){
			ans=min(ans,dis[x][i]);
			ans=min(ans,dis[y][i]);
			x=up[x][i],y=up[y][i];
		}
	}
	ans=min(ans,min(dis[x][0],dis[y][0]));
	if(ans==1061109567)return -1;
	return ans;
}

signed main(){
	n=read(),m=read();
	for(int i=1;i<=n;i++){
		lg[i]=lg[i-1];
		if(i==(1<<lg[i-1]))lg[i]++;
	} 
	for(int i=1;i<=m;i++){
		int u=read(),v=read(),w=read();
		e[i]=mst{u,v,w};
	}
	memset(dis,inf,sizeof(dis));
	kruskal();
	Dfs(1,0,inf);
	int Q=read();
	while(Q--){
		int x=read(),y=read();
		printf("%lld\n",Query(x,y));
	}
	return 0;
}

谢谢!

2024/1/4 21:44
加载中...