首页 > 代码库 > BZOJ 1602: [Usaco2008 Oct]牧场行走
BZOJ 1602: [Usaco2008 Oct]牧场行走
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1602
解:lca的模板,我用的是倍增。
程序:
#include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> using namespace std; struct ding{ int to,next,val; }edge[2010]; int n,q,f[1010][11],dep[1010],cnt,head[1010],sum[1010]; bool vis[1010]; inline int read() { int ef=0; char ch; while ((ch<‘0‘)||(ch>‘9‘)) ch=getchar(); while ((ch>=‘0‘)&&(ch<=‘9‘)) { ef=ef*10+ch-‘0‘; ch=getchar(); } return ef; } void add(int u,int v,int w) { edge[++cnt].to=v; edge[cnt].val=w; edge[cnt].next=head[u]; head[u]=cnt; } void dfs(int x,int d) { vis[x]=true; dep[x]=d; for (int i=1;i<=10;i++) f[x][i]=f[f[x][i-1]][i-1]; for (int i=head[x];i;i=edge[i].next) { int y=edge[i].to; if (!vis[y]) { f[y][0]=x; sum[y]+=sum[x]+edge[i].val;dfs(y,d+1); } } } int lca(int u,int v) { if (dep[u]>dep[v]) return (lca(v,u)); int x=dep[v]-dep[u]; for (int i=10;i>=0;i--) if (x&(1<<i)) v=f[v][i]; if (u==v) return u; for (int i=10;i>=0;i--) if (f[u][i]!=f[v][i]) { u=f[u][i]; v=f[v][i]; } return f[u][0]; } int main() { n=read(); q=read(); int x,y,w; for (int i=1;i<n;i++) { x=read(); y=read(); w=read(); add(x,y,w); add(y,x,w); } f[1][0]=1; dfs(1,1); for (int i=1;i<=q;i++) { x=read(); y=read(); printf("%d\n",sum[x]+sum[y]-2*sum[lca(x,y)]); } return 0; }
BZOJ 1602: [Usaco2008 Oct]牧场行走
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。