LCA【bzoj3364】 [Usaco2004 Feb]Distance Queries 距离咨询
2018-10-11 16:48
477 查看
Description
奶牛们拒绝跑马拉松,因为她们悠闲的生活无法承受约翰选择的如此长的赛道.因此约翰决心找一条更合理的赛道,他打算咨询你.此题的地图形式与前两题相同.但读入地图之后,会有K个问题.每个问题包括2个整数,就是约翰感兴趣的2个农场的编号,请尽快算出这2个农场间的距离.
Input
第1到I+M行:与前两题相同;
第2+M行:一个整数K(1≤K≤10000).
第3+M到2+M+K行:每行输入2个整数,代表两个农场.
Output
对每个问题,输出单独的一个整数,给出正确的距离.
明显\(LCA\)问题。
\(Dfs\)建树之后,对于每个询问,直接求带权\(LCA\)即可
代码
#include<cstdio> #include<iostream> #include<cstring> #include<cctype> #define R register #define N 100860 using namespace std; inline void in(int &x) { int f=1;x=0;char s=getchar(); while(!isdigit(s)){if(s=='-')f=-1;s=getchar();} while(isdigit(s)){x=x*10+s-'0';s=getchar();} x*=f; } int n,m,head ,tot,now,ans,gw [21],f [21],q; int depth ; struct cod{int u,v,w;}edge[N<<2]; inline void add(int x,int y,int z) { edge[++tot].u=head[x]; edge[tot].v=y; edge[tot].w=z; head[x]=tot; } void dfs(int u,int fa,int dist) { gw[u][0]=dist;f[u][0]=fa; depth[u]=depth[fa]+1; for(R int i=1;(1<<i)<=depth[u];i++) { f[u][i]=f[f[u][i-1]][i-1]; gw[u][i]=gw[u][i-1]+gw[f[u][i-1]][i-1]; } for(R int i=head[u];i;i=edge[i].u) { if(edge[i].v==fa)continue; dfs(edge[i].v,u,edge[i].w); } } inline int lca(int x,int y) { int res=0; if(depth[x]>depth[y])swap(x,y); for(R int i=17;i>=0;i--) if(depth[x]+(1<<i)<=depth[y]) res+=gw[y][i],y=f[y][i]; if(x==y)return res; for(R int i=17;i>=0;i--) { if(f[y][i]==f[x][i])continue; res+=gw[x][i]+gw[y][i]; y=f[y][i],x=f[x][i]; } return res+gw[y][0]+gw[x][0]; } int main() { in(n),in(m); for(R int i=1,x,y,z;i<=m;i++) { R char opt; in(x),in(y),in(z);cin>>opt; add(x,y,z);add(y,x,z); } dfs(1,0,0); in(q); for(R int l,r;q;q--) { in(l),in(r); printf("%d\n",lca(l,r)); } }
相关文章推荐
- bzoj 3364: [Usaco2004 Feb]Distance Queries 距离咨询 LCA
- BZOJ3364: [Usaco2004 Feb]Distance Queries 距离咨询 LCA
- LCA【bzoj3364】: [Usaco2004 Feb]Distance Queries 距离咨询
- BZOJ 3364: [Usaco2004 Feb]Distance Queries 距离咨询
- BZOJ3364: [Usaco2004 Feb]Distance Queries 距离咨询
- 【BZOJ】3364: [Usaco2004 Feb]Distance Queries 距离咨询
- 【bzoj3362/3363/3364/3365】[Usaco2004 Feb]树上问题杂烩 并查集/树的直径/LCA/树的点分治
- [BZOJ2684][USACO 2004 FEB]距离询问
- [BZOJ3362][Usaco2004 Feb]Navigation Nightmare 导航噩梦(加权并查集)
- bzoj 3372: [Usaco2004 Feb]Moo University -- Financial Aid 财政补助 二分
- BZOJ3367 [Usaco2004 Feb]The Big Game 球赛
- bzoj 3369: [Usaco2004 Feb]Pesky Parentheses 烦人括号(思维题)
- bzoj 3362: [Usaco2004 Feb]Navigation Nightmare 导航噩梦(加权并查集)
- [BZOJ3365][Usaco2004 Feb]Distance Statistics 路程统计(点分治)
- bzoj 3365 [Usaco2004 Feb]Distance Statistics 路程统计(点分治,单调)
- bzoj 3367: [Usaco2004 Feb]The Big Game 球赛(DP)
- POJ 1987 BZOJ 3365 USACO 2004 Feb Distance Statistics 路程统计 点分治
- POJ 1984/BZOJ 3362: [Usaco2004 Feb]Navigation Nightmare 导航噩梦
- BZOJ 3365 [Usaco2004 Feb]Distance Statistics 路程统计 树的点分治
- bzoj3362[Usaco2004 Feb]Navigation Nightmare 导航噩梦(带权并查集)