95pt,#16WA求调
查看原帖
95pt,#16WA求调
556974
Solar_Rain楼主2024/7/19 10:37

这里是评测链接:Link

//Solar_Rain
//2024-07-19
//P1967 [NOIP2013 提高组] 货车运输
#include<iostream>
#include<algorithm>
using namespace std;

const int N=1e4+3,M=5e4+3;
int h[N],v[N*2],w[N*2],nt[N*2],newnod=1;
int f[N];
int n,m,q;
int d[N],fi[N][21],wi[N][21];
int ans;

void push(int u_in,int v_in,int w_in){
	v[newnod]=v_in;
	w[newnod]=w_in;
	nt[newnod]=h[u_in];
	h[u_in]=newnod++;
}

int findf(int x){
	if(f[x]==x)return x;
	return f[x]=findf(f[x]);
}

struct Nod{
	int x,y;
	int w;
}nod[M];

bool cmp(Nod a,Nod b){
	return a.w>b.w;
}
int bk[N];
void dfs(int u,int fa,int weight){
	bk[u]=1;
	d[u]=d[fa]+1,fi[u][0]=fa,wi[u][0]=weight;
	for(int i=1;i<=20;i++){
		fi[u][i]=fi[fi[u][i-1]][i-1];
		wi[u][i]=min(wi[u][i-1],wi[fi[u][i-1]][i-1]);
	}
		
	for(int i=h[u];i;i=nt[i]){
		if(v[i]==fa)continue;
		dfs(v[i],u,w[i]);
	}
}

int lca(int a,int b){
	int ans=1000000;
	if(d[a]>d[b])swap(a,b);
	for(int i=20;i>=0;i--)if(d[b]-(1<<i)>=d[a])ans=min(ans,wi[b][i]),b=fi[b][i];
	if(a==b)return ans;
	for(int i=20;i>=0;i--)
		if(fi[a][i]!=fi[b][i]){
			ans=min(ans,min(wi[a][i],wi[b][i]));
			a=fi[a][i],b=fi[b][i];
		}
	ans=min(ans,wi[a][0]);
	ans=min(ans,wi[b][0]);
	return ans;
}

int main(){
	cin>>n>>m;
	for(int i=1,x,y,z;i<=m;i++){
		cin>>x>>y>>z;
		nod[i].x=x;
		nod[i].y=y;
		nod[i].w=z;
	}
	
	sort(nod+1,nod+m,cmp);
	for(int i=1;i<=n;i++)f[i]=i;
	for(int i=1;i<=m;i++){
		if(findf(nod[i].x)==findf(nod[i].y))continue;
		push(nod[i].x,nod[i].y,nod[i].w);
		push(nod[i].y,nod[i].x,nod[i].w);
		f[findf(nod[i].x)]=findf(nod[i].y);//mrg
	}
	for(int i=1;i<=n;i++)
		if(!bk[i])dfs(i,0,1000000);
	cin>>q;
	int x,y;
	while(q--){
		cin>>x>>y;
		if(findf(x)!=findf(y)){
			cout<<-1<<endl;
			continue;
		}
		cout<<lca(x,y)<<endl;
	}
	return 0;
}
2024/7/19 10:37
加载中...