bzoj1602[Usaco2008 Oct]牧场行走(lca模版)
2017-09-05 16:58
281 查看
Lca裸题
#include<iostream> #include<cstdio> #include<cmath> #include<cstring> #include<algorithm> #define fo(i,a,b) for(int i=a;i<=b;i++) #define fod(i,a,b) for(int i=a;i>=b;i--) using namespace std; const int N=1e3+10; int dep ,f [10],dis , n,q,len=0,last ; struct Edge{int to,next,val;Edge(int to=0,int next=0,int val=0):to(to),next(next),val(val){}}e[N<<1]; void add_edge(int u,int v,int w){e[++len]=Edge(v,last[u],w);last[u]=len;} void dfs(int u,int fa) { for(int i=1;i<=9;i++) { if(dep[u]<(1<<i))break; f[u][i]=f[f[u][i-1]][i-1]; } for(int i=last[u];i;i=e[i].next){ int id=e[i].to; if(id==fa)continue; dep[id]=dep[u]+1;dis[id]=dis[u]+e[i].val; f[id][0]=u; dfs(id,u); } } int lca(int x,int y) { if(dep[x]<dep[y])swap(x,y); int d=dep[x]-dep[y]; for(int i=0;i<=9;i++){ if(d&(1<<i))x=f[x][i]; } for(int i=9;i+1;i--) { if(f[x][i]!=f[y][i]) x=f[x][i],y=f[y][i]; } if(x==y)return x; else return f[x][0]; } int main() { scanf("%d%d",&n,&q); for(int u,v,w,i=1;i<n;i++) { scanf("%d%d%d",&u,&v,&w); add_edge(u,v,w);add_edge(v,u,w); } dfs(1,0); for(int x,y,i=1;i<=q;i++) { scanf("%d%d",&x,&y); printf("%d\n",dis[x]+dis[y]-2*dis[lca(x,y)]); } return 0; }
相关文章推荐
- [BZOJ1602][Usaco2008 Oct]牧场行走(LCA)
- bzoj 1602: [Usaco2008 Oct]牧场行走(暴力LCA)
- BZOJ 1602 Usaco2008 Oct 牧场行走 倍增LCA
- 【BZOJ】1602: [Usaco2008 Oct]牧场行走(lca)
- bzoj 1602 [Usaco2008 Oct]牧场行走(LCA模板)
- bzoj 1602 [Usaco2008 Oct]牧场行走(LCA模板)
- [Usaco2008 Oct][BZOJ1602] 牧场行走
- BZOJ 1602: [Usaco2008 Oct]牧场行走
- bzoj1602 [Usaco2008 Oct]牧场行走
- bzoj1602 [Usaco2008 Oct]牧场行走
- BZOJ1602: [Usaco2008 Oct]牧场行走
- [BZOJ]1602: [Usaco2008 Oct]牧场行走
- BFS-BZOJ-1602-[Usaco2008 Oct]牧场行走
- 【BZOJ】1602:[Usaco2008 Oct]牧场行走
- 【bzoj1602】【Usaco2008 Oct】牧场行走 (暴力) 题解&代码
- [BZOJ1602][Usaco2008 Oct]牧场行走
- bzoj1602: [Usaco2008 Oct]牧场行走 暴力dfs
- BZOJ 1602: [Usaco2008 Oct]牧场行走
- BZOJ 1602: [Usaco2008 Oct]牧场行走( 最短路 )
- bzoj 1602: [Usaco2008 Oct]牧场行走