ENFP-T型人格患者|

_Youngxy

园龄:3年7个月粉丝:5关注:28

[NOIP2013 提高组] 货车运输 题解报告

[NOIP2013 提高组] 货车运输

传送门

求两点之间任意一条路径上最大的最小点

一句话题解:先用kru求出最大生成树,然后再最大生成树上跑lca

#include<bits/stdc++.h>
#define MAX 999999999
using namespace std;
const int N=50005;
int n,q,t,m,x,y,cnt;
int hd[N],f[N],fa[N][21],w[N][21],d[N];
bool vis[N];
struct node{
	int x,y,z;
}a[N];//图 
struct edge{
	int to,nex,w;
}b[N*2];//最大生成树 
void add(int u,int v,int w) {
	b[++cnt].nex=hd[u];
	b[cnt].to=v;
	b[cnt].w=w;
	hd[u]=cnt;
}//建树 
int cmp(node x,node y){
	return x.z>y.z;
}
int find(int x){
	if(x!=f[x]) f[x]=find(f[x]);
	return f[x];
}
void kru(){
	sort(a+1,a+1+m,cmp);
	for(int i=1;i<=n;i++) {
		f[i]=i;
	}//并查集
	for(int i=1;i<=m;i++) {
		if(find(a[i].x)!=find(a[i].y)) {
			f[find(a[i].x)]=find(a[i].y);
			add(a[i].x,a[i].y,a[i].z);
			add(a[i].y,a[i].x,a[i].z);
		}
	} 
}
void dfs(int u) {
	vis[u]=true;
	for(int i=hd[u]; i; i=b[i].nex) {
		int v=b[i].to; 
		if(vis[v]) continue;
		d[v]=d[u]+1;
		fa[v][0]=u;//初始化父亲节点 
		w[v][0]=b[i].w;
		dfs(v);
	}
}
int lca(int x,int y) {
	if(find(x)!=find(y)) return -1;
	int ans=MAX;
	if(d[x]<d[y]) swap(x,y);
	for(int i=t; i>=0; i--) {
		if(d[fa[x][i]]>=d[y]) {
			ans=min(ans,w[x][i]); //更新最大载重(最小边权)
			x=fa[x][i];//跳到与y统一深度 
		}
	}
	if(x==y) return ans;
	for(int i=t; i>=0; i--) 
		if(fa[x][i]!=fa[y][i]) {
			ans=min(ans,min(w[x][i],w[y][i]));
			x=fa[x][i],y=fa[y][i];//同时向上跳
		}
	ans=min(ans,min(w[x][0],w[y][0]));
	 //更新此时x,y到公共祖先最大载重,fa[x][0]/fa[y][0]即为公共祖先 
	return ans;
}//用最近公共祖先求最小边权 


int main() {
	scanf("%d%d",&n,&m);
	t=20;
	for(int i=1; i<=m; i++) {
		scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].z);
	}
	kru();
	for(int i=1;i<=n;i++) {
		if(!vis[i]) {//根 
			d[i]=1;
			dfs(i);
			fa[i][0]=i;
			w[i][0]=MAX; 
		}
	}
	for(int i=1;i<=t;i++) {
		for(int j=1;j<=n;j++) {
			fa[j][i]=fa[fa[j][i-1]][i-1];
			w[j][i]=min(w[j][i-1],w[fa[j][i-1]][i-1]);
		}
	}
	scanf("%d",&q);
	for(int i=1;i<=q;i++) {
		scanf("%d%d",&x,&y);
		printf("%d\n",lca(x,y));
	}
	return 0;
}

洛谷题解

本文作者:Yvette的博客

本文链接:https://www.cnblogs.com/yvette1217/p/16132112.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   _Youngxy  阅读(47)  评论(0编辑  收藏  举报
评论
收藏
关注
推荐
深色
回顶
收起
点击右上角即可分享
微信分享提示