【BZOJ3732】Network 最小生成树+LCA

2 篇文章 0 订阅
2 篇文章 0 订阅

这根本明明和NOIP2013第三题火车运输几乎一模一样的好吗?

要求难度在省选之上难道也是在逗我?或者NOIP的难度已经在省选之上了?0.0

回想起当初的我,刚刚学会结构体快排qsort就上考场(那时的我们还是C党)……那时的我还不知道什么是邻接矩阵(更别提链式前向星)……那时的我写了一个开心的不读入优化……那时的我此题爆零……

求一下最小生成树,再LCA(什么?倍增?为什么我没有用也AC了?0.0)……

至于结构体什么名字,我想还是叫 MaiMeng 比较合适(现在写的话我会写成 pair<pair<int,int>,int>...)~~

附C++代码(为什么不用sort?因为我当初不会重载bool运算符):

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define N 15010
#define M 30010
int cnt,to[M],v[M],next[M],head[N];
int n,m,q,f[N],fa[N],deep[N],dist[N],tot;
void add(int x,int y,int z)
{
	v[++cnt]=z;
	to[cnt]=y;
	next[cnt]=head[x];
	head[x]=cnt;
}
struct MaiMeng
{
	int u,v,w;
}edge[M];
int cmp(const void *a,const void *b)
{
	struct MaiMeng *x=(struct MaiMeng *)a;
	struct MaiMeng *y=(struct MaiMeng *)b;
	return x->w-y->w;
}
int find(int x)
{
	if(f[x]==x) return x;
	return f[x]=find(f[x]);
}
int lca(int x,int y)
{
	int re=0;
	if(deep[x]<deep[y])     swap(x,y);
	while(deep[x]>deep[y])   re=max(re,dist[x]),x=fa[x]; 
	while(x!=y)	 re=max(re,max(dist[x],dist[y])),x=fa[x],y=fa[y];	
	return re;
}
void dfs(int x,int pre,int step,int d)
{
	fa[x]=pre;deep[x]=step;dist[x]=d;
	for(int i=head[x];i;i=next[i])
		if(to[i]!=fa[x])
			dfs(to[i],x,step+1,v[i]);
}
int main()
{
	cin>>n>>m>>q;
	for(int i=1;i<=n;i++)
		f[i]=i;
	for(int x,y,z,i=1;i<=m;i++)
	{
		scanf("%d%d%d",&x,&y,&z);
		edge[i].u=x;
		edge[i].v=y;
		edge[i].w=z;
	}
	qsort(edge+1,m,sizeof(edge[1]),cmp);
	for(int i=1;i<=m;i++)
	{
		int fx=find(edge[i].u),fy=find(edge[i].v);
		if(fx!=fy)
		{
			tot++;
			f[fx]=fy;
			add(edge[i].u,edge[i].v,edge[i].w);
			add(edge[i].v,edge[i].u,edge[i].w);
		}
	}
	for(int i=1;i<=n;i++)
		if(f[i]==i)
			dfs(i,0,1,0);
	for(int x,y,i=1;i<=q;i++)
	{
		scanf("%d%d",&x,&y);
		printf("%d\n",lca(x,y));
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值