/*
在我还不知道LCA之前 暴力跑的SPFA
70分 三个点TLE
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
struct node
{
int u;
int t;
int pre;
};
node a[*+];
queue<int>q;
int n,qq,x[],num,head[],f[],dis[],sum;
void add(int from,int to)
{
num++;
a[num].pre=head[from];
a[num].u=to;
a[num].t=;
head[from]=num;
}
void SPFA()
{
int i,j;
for(j=;j<=qq-;j++)
{
memset(dis,/,sizeof(dis));
memset(f,,sizeof(f));
int s=x[j];
int v=x[j+];
q.push(s);
f[s]=;
dis[s]=;
do
{
int k=q.front();
q.pop();
f[k]=;
for(i=head[k];i;i=a[i].pre)
{
if(dis[a[i].u]>dis[k]+a[i].t)
{
dis[a[i].u]=dis[k]+a[i].t;
if(f[a[i].u]==)
{
q.push(a[i].u);
f[a[i].u]=;
}
}
}
}while(!q.empty());
sum=sum+dis[v];
}
}
int main()
{
int i,o,u;
cin>>n;
for(i=;i<=n-;i++)
{
cin>>o>>u;
add(o,u);
add(u,o);
}
cin>>qq;
for(i=;i<=qq;i++)
cin>>x[i];
SPFA();
cout<<sum;
}
/*
倍增LCA
将旅行路线两两拆开 求相邻两点的距离
即求他们到lca的距离和
这里用倍增法实现求距离 fa[i][j]表示i节点往上2^j层的节点是什么
因为1 2 4 8 16...做和可以表示所有的整数 所以保证覆盖整张图
先Dfs建图 顺面几下每个节点的所在层 以及fa[i][0] 的值
然后DP预处理fa数组
然后就是求到lca的距离了
这里我们求出只需要求出lca是谁 那么两点之间的最小距离就是
deep[p1]+deep[p2]-2*deep[anc] deep是深度
剩下的就仅仅是找lca是谁了
对于一组a ,b 如果他们在同一层的话 我们只需要同时向上移动他俩 知道a==b */
#include<iostream>
#include<cstdio>
#include<cstring>
#define maxn 30010
#define S 16
int n,m,num,head[maxn],fa[maxn][S+],deep[maxn],p1,p2,ans;
struct node
{
int u,v,pre;
}e[maxn*];
void Add(int from,int to)
{
num++;
e[num].u=from;
e[num].v=to;
e[num].pre=head[from];
head[from]=num;
}
void swap(int &a,int &b)
{
int t=a;a=b;b=t;
}
void init()
{
scanf("%d",&n);
int x,y;
for(int i=;i<=n-;i++)
{
scanf("%d%d",&x,&y);
Add(x,y);Add(y,x);
}
}
void get_fa()
{
for(int j=;j<=S;j++)
for(int i=;i<=n;i++)
fa[i][j]=fa[fa[i][j-]][j-];//数学方法展开就是fa[i][j]
}
void Dfs(int now,int from,int c)//得带每个点的所在层
{
fa[now][]=from;
deep[now]=c;
for(int i=head[now];i;i=e[i].pre)
if(e[i].v!=from)
Dfs(e[i].v,now,c+);
}
int get_same(int a,int t)//计算a往上t层是啥
{
for(int i=;i<=t;i++)
a=fa[a][];
return a;
}
int LCA(int a,int b)
{
if(deep[a]<deep[b])swap(a,b);//保证a深度大
a=get_same(a,deep[a]-deep[b]);//得到a向上deep[a]-deep[b]层是谁 即a的与b同层的祖先是谁
if(a==b)return a;//如果汇聚到一个点 就不用往上了
for(int i=S;i>=;i--)//这里有套路 从最大值开始循环 一开始 fa[a][i] fa[b][i]一定是相等的
//因为此时位于他们lca之上 然后往下 这里可以覆盖每一层
if(fa[a][i]!=fa[b][i])
{
a=fa[a][i];
b=fa[b][i];
}
return fa[a][];
}
int main()
{
init();
Dfs(,,);
get_fa();
scanf("%d%d",&m,&p1);
for(int i=;i<=m-;i++)
{
scanf("%d",&p2);
int anc=LCA(p1,p2);
ans+=deep[p1]+deep[p2]-*deep[anc];
p1=p2;
}
printf("%d\n",ans);
return ;
}

codevs 1036 商务旅行 (倍增LCA)的更多相关文章

  1. 倍增法-lca codevs 1036 商务旅行

    codevs 1036 商务旅行  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond 题目描述 Description 某首都城市的商人要经常到各城镇去做生意 ...

  2. CodeVs.1036 商务旅行 ( LCA 最近公共祖先 )

    CodeVs.1036 商务旅行 ( LCA 最近公共祖先 ) 题意分析 某首都城市的商人要经常到各城镇去做生意,他们按自己的路线去做,目的是为了更好的节约时间. 假设有N个城镇,首都编号为1,商人从 ...

  3. codevs——1036 商务旅行

    1036 商务旅行  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond 题解  查看运行结果     题目描述 Description 某首都城市的商人要经常 ...

  4. codevs 1036 商务旅行(Targin求LCA)

    传送门 Description 某首都城市的商人要经常到各城镇去做生意,他们按自己的路线去做,目的是为了更好的节约时间. 假设有N个城镇,首都编号为1,商人从首都出发,其他各城镇之间都有道路连接,任意 ...

  5. CODEVS 1036 商务旅行

    题目描述 Description 某首都城市的商人要经常到各城镇去做生意,他们按自己的路线去做,目的是为了更好的节约时间. 假设有N个城镇,首都编号为1,商人从首都出发,其他各城镇之间都有道路连接,任 ...

  6. 【最近公共祖先】【树链剖分】CODEVS 1036 商务旅行

    树链剖分求lca模板.O(log(n)),就是不倍增嘛~ #include<cstdio> #include<algorithm> using namespace std; # ...

  7. 【最近公共祖先】【块状树】CODEVS 1036 商务旅行

    在线块状树LCA模板. #include<cstdio> #include<vector> #include<algorithm> #include<cmat ...

  8. codevs1036商务旅行(LCA)

    1036 商务旅行  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond 题解       题目描述 Description 某首都城市的商人要经常到各城镇去做 ...

  9. CODEVS——T 1036 商务旅行

    http://codevs.cn/problem/1036/  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond 题解       题目描述 Descript ...

随机推荐

  1. 一个简单的多线程Python爬虫(一)

    一个简单的多线程Python爬虫 最近想要抓取拉勾网的数据,最开始是使用Scrapy的,但是遇到了下面两个问题: 前端页面是用JS模板引擎生成的 接口主要是用POST提交参数的 目前不会处理使用JS模 ...

  2. Windows 10正式版密钥大全,Win10激活序列号KEY大全

    最新放出来的Win10密钥:NJ4MX-VQQ7Q-FP3DB-VDGHX-7XM87 MH37W-N47XK-V7XM9-C7227-GCQG9 VK7JG-NPHTM-C97JM-9MPGT-3V ...

  3. Java中传参的值传递和引用传递问题(转)

    今天遇到了一个java程序,需要用参数来返回值(虽然最后用另一种方法实现了),在网上看到这样一篇文章,很受启发. 本文章来自于http://hi.baidu.com/xzhilie/blog/item ...

  4. asp.net web api long running task

    http://stackoverflow.com/questions/17577016/long-running-task-in-webapi http://blog.stephencleary.co ...

  5. 如何从BBC网站学习英语

  6. myeclipse spket spket-1.6.23.jar 破解安装教程

    一年前安装文档就写过了,今天写破解文档,本来开发js/ext是想用aptana的,但是安装包100多M,我还是用spket吧(才11M),这个需要破解一下license,否则用不了. 一 安装教程如下 ...

  7. WPAD 的原理及实现

    WPAD 通过让浏览器自动发现代理服务器,使代理服务器对用户来说是透明的,进而轻松访问互联网.WPAD 可以借助 DNS 服务器或 DHCP 服务器来查询代理自动配置(PAC)文件的位置. 引言 代理 ...

  8. 跨平台网络通信与服务器框架 acl 3.2.0 发布

    acl 3.2.0 版本发布了,acl 是 one advanced C/C++ library 的简称,主要包括网络通信库以及服务器框架库等功能,支持 Linux/Windows/Solaris/F ...

  9. Linux 配置多IP

    这里以红帽Linux为例.假定原系统已配置一个IP,地址为:192.168.20.140,配置文件路径/etc/sysconfig/network-script/ifcfg-eth0.现在需要配置一个 ...

  10. Extjs4中tabPanel

    好文章引用:Extjs4 TabPanel例子 感谢原作者...