这根本明明和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;
}