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;
}
时间: 2024-10-06 23:58:27

BZOJ 1602: [Usaco2008 Oct]牧场行走的相关文章

bzoj 1602 [Usaco2008 Oct]牧场行走(LCA模板)

1602: [Usaco2008 Oct]牧场行走 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 379  Solved: 216[Submit][Status][Discuss] Description N头牛(2<=n<=1000)别人被标记为1到n,在同样被标记1到n的n块土地上吃草,第i头牛在第i块牧场吃草. 这n块土地被n-1条边连接. 奶牛可以在边上行走,第i条边连接第Ai,Bi块牧场,第i条边的长度是Li(1<=Li<=1

BZOJ 1602: [Usaco2008 Oct]牧场行走( 最短路 )

一棵树..或许用LCA比较好吧...但是我懒...写了个dijkstra也过了.. ---------------------------------------------------------------------------- #include<cstdio> #include<algorithm> #include<queue> #include<cstring> #include<iostream> #define rep( i ,

BZOJ——1602: [Usaco2008 Oct]牧场行走

http://www.lydsy.com/JudgeOnline/problem.php?id=1602 题目描述 N头牛(2<=n<=1000)别人被标记为1到n,在同样被标记1到n的n块土地上吃草,第i头牛在第i块牧场吃草. 这n块土地被n-1条边连接. 奶牛可以在边上行走,第i条边连接第Ai,Bi块牧场,第i条边的长度是Li(1<=Li<=10000). 这些边被安排成任意两头奶牛都可以通过这些边到达的情况,所以说这是一棵树. 这些奶牛是非常喜欢交际的,经常会去互相访问,他们

1602: [Usaco2008 Oct]牧场行走

1602: [Usaco2008 Oct]牧场行走 Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 1211  Solved: 616 [Submit][Status] Description N头牛(2<=n<=1000)别人被标记为1到n,在同样被标记1到n的n块土地上吃草,第i头牛在第i块牧场吃草. 这n块土地被n-1条边连接. 奶牛可以在边上行走,第i条边连接第Ai,Bi块牧场,第i条边的长度是Li(1<=Li<=10000).

[BZOJ1602][Usaco2008 Oct]牧场行走

1602: [Usaco2008 Oct]牧场行走 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 2065  Solved: 1084[Submit][Status][Discuss] Description N头牛(2<=n<=1000)别人被标记为1到n,在同样被标记1到n的n块土地上吃草,第i头牛在第i块牧场吃草. 这n块土地被n-1条边连接. 奶牛可以在边上行走,第i条边连接第Ai,Bi块牧场,第i条边的长度是Li(1<=Li<

【bzoj1602】[Usaco2008 Oct]牧场行走

1602: [Usaco2008 Oct]牧场行走 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1793  Solved: 935[Submit][Status][Discuss] Description N头牛(2<=n<=1000)别人被标记为1到n,在同样被标记1到n的n块土地上吃草,第i头牛在第i块牧场吃草. 这n块土地被n-1条边连接. 奶牛可以在边上行走,第i条边连接第Ai,Bi块牧场,第i条边的长度是Li(1<=Li<=

[BZOJ1602] [Usaco2008 Oct] 牧场行走 (LCA)

Description N头牛(2<=n<=1000)别人被标记为1到n,在同样被标记1到n的n块土地上吃草,第i头牛在第i块牧场吃草. 这n块土地被n-1条边连接. 奶牛可以在边上行走,第i条边连接第Ai,Bi块牧场,第i条边的长度是Li(1<=Li<=10000). 这些边被安排成任意两头奶牛都可以通过这些边到达的情况,所以说这是一棵树. 这些奶牛是非常喜欢交际的,经常会去互相访问,他们想让你去帮助他们计算Q(1<=q<=1000)对奶牛之间的距离. Input *

BZOJ 1599: [Usaco2008 Oct]笨重的石子( 枚举 )

直接枚举 ------------------------------------------------------------------------------- #include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #define rep( i , n ) for( int i = 0 ;  i < n ; ++i ) #define clr( x ,

BZOJ 1601: [Usaco2008 Oct]灌水( MST )

MST , kruskal 直接跑 ---------------------------------------------------------------------- #include<cstdio> #include<algorithm> #include<vector> #include<cstring> #include<iostream> #define rep( i , n ) for( int i = 0 ; i <