您的位置:首页 > 其它

【BZOJ3732】Network 最小生成树+LCA

2014-10-04 16:40 525 查看
这根本明明和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
;
int n,m,q,f
,fa
,deep
,dist
,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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: