第一题LCA,代码参考自:Ice_Crazy

思路:

这个最短路算法是想都别想了,可以看出这幅图就是树嘛,那么对于查询就是求树上两个结点最短距离。

这里就是利用LCA的tarjan离线算法。

算法的大致流程:

对于每一点u,

①  :建立以u为代表元素的集合。

②  :遍历与u相连的结点v,如果没有访问过,对与v使用Tarjan-LCA算法,结束后,将v的集合并入u的集合。

③  :对于与u相关的询问(u,v),如果v被访问过,则结果就是v所在集合的代表。

在这里还需要算距离,需要深度:dis<v1,v2>=dis[v1]+dis[v2]-2*dis[lca];



简要说下这份代码的几个变量的作用:

vis[ ]是用来确定集合,可能存在多棵树?

pre[ ]每次存的是前驱,为什么正好在Find()过程中就他们的LCA呢?

这是因为一直在处理的是子树呀!对于结点yeye,他的son结点叫baba,结点baba有两个结点:结点sunzei,结点sunnv。

本身Tarjan就是个DFS,所以搜索的话要一直处理完子树所有,也就是处理完结点baba的所有,才会处理到结点yeye,对于当前子树而言,并查集的作用也是对于当前子树的情况,所以结点sunzei和sunnv的LCA就是baba,不是yeye。

大致感觉也能感觉粗来吧?

PS:这份代码 HDU2586 改改就过了,而且题目中的说的空行是没有的~(蜜汁怂恿贴代码嫌疑。。)

#include <bits/stdc++.h>
using namespace std;
typedef long long LL; const int maxm=2e4+10;
const int maxn=1e4+10;
const int maxq=2e6+10;
struct Node{
int to;
int w;
int next;
}e[maxm];
int eh[maxn],dis[maxn],pre[maxn],etol,vis[maxn];
struct Query{
int to;
int index;
int next;
}qe[maxq];
int qh[maxn],ans[maxq/2],qtol;
int n,m,c; void init()
{
etol=qtol=0;
memset(eh,-1,sizeof(eh));
memset(qh,-1,sizeof(qh));
} void add1(int u,int v,int w)
{
e[etol].to=v;
e[etol].w=w;
e[etol].next=eh[u];
eh[u]=etol++;
} void add2(int u,int v,int id)
{
qe[qtol].index=id;
qe[qtol].to=v;
qe[qtol].next=qh[u];
qh[u]=qtol++;
} int Find(int u)
{
if(pre[u]!=u) pre[u]=Find(pre[u]);
return pre[u];
} void LCA(int u,int deep,int root)
{
pre[u]=u;
dis[u]=deep;
vis[u]=root;
for(int i=eh[u];~i;i=e[i].next)
{
int v=e[i].to;
if(vis[v]==-1)
{
LCA(v,deep+e[i].w,root);
pre[v]=u;
}
}
for(int i=qh[u];~i;i=qe[i].next)
{
int v=qe[i].to;
if(vis[v]==root)
ans[qe[i].index]=dis[v]+dis[u]-2*dis[Find(v)];
}
} int main()
{
while(~scanf("%d%d%d",&n,&m,&c))
{
int u,v,w;
init();
while(m--)
{
scanf("%d%d%d",&u,&v,&w);
add1(u,v,w);
add1(v,u,w);
}
for(int i=0;i<c;i++)
{
scanf("%d%d",&u,&v);
ans[i]=-1;
add2(u,v,i);
add2(v,u,i);
}
memset(vis,-1,sizeof(vis));
for(int i=1;i<=n;i++){
if(vis[i]==-1)
LCA(i,0,i);
}
for(int i=0;i<c;i++)
{
if(ans[i]==-1) puts("Not connected");
else printf("%d\n",ans[i]);
}
}
return 0;
}

HDU2874【LCA(模板)】的更多相关文章

  1. LCA模板

    /*********--LCA模板--***************/ //设置好静态参数并构建好图的邻接表,然后调用lca_setquery()设置查询 //最后调用lca_start(),在lca ...

  2. 倍增求lca模板

    倍增求lca模板 https://www.luogu.org/problem/show?pid=3379 #include<cstdio> #include<iostream> ...

  3. hdu2874(lca / tarjan离线 + RMQ在线)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2874 题意: 给出 n 个顶点 m 条边的一个森林, 有 k 个形如 x y 的询问, 输出 x, ...

  4. HDU 2586——How far away ?——————【LCA模板题】

    How far away ? Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  5. 算法复习——LCA模板(POJ1330)

    题目: Description A rooted tree is a well-known data structure in computer science and engineering. An ...

  6. hdu 2586 How far away?(LCA模板题+离线tarjan算法)

    How far away ? Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  7. LCA模板(数剖实现)

    题目链接:https://www.luogu.org/problemnew/show/P3379 题意:LCA模板题. 思路:今天开始学树剖,先拿lca练练.树剖解lca,两次dfs复杂度均为O(n) ...

  8. POJ 1330 Nearest Common Ancestors(LCA模板)

    给定一棵树求任意两个节点的公共祖先 tarjan离线求LCA思想是,先把所有的查询保存起来,然后dfs一遍树的时候在判断.如果当前节点是要求的两个节点当中的一个,那么再判断另外一个是否已经访问过,如果 ...

  9. HDU2586 How far away ?(LCA模板题)

    题目链接:传送门 题意: 给定一棵树,求两个点之间的距离. 分析: LCA 的模板题目 ans = dis[u]+dis[v] - 2*dis[lca(u,v)]; 在线算法:详细解说 传送门 代码例 ...

随机推荐

  1. NISP:一级取证

    NISP:一级取证 BrupSuite工具的使用 设置浏览器代理 flag{C0ngratulati0n} flag{LMvBi8w9$m1TrgK4} flag{T4mmL9GhpaKWunPE} ...

  2. HDU - 4990 Reading comprehension 【矩阵快速幂】

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=4990 题意 初始的ans = 0 给出 n, m for i in 1 -> n 如果 i 为奇 ...

  3. P3968 [TJOI2014]电源插排

    P3968 [TJOI2014]电源插排 线段树维护最长空区间及左端点位置,这个和$nlongn$的动态最大子序和差不多,就不多解释了 $n$较大哈希优化空间 My complete code: #i ...

  4. ios浮层滑动不流畅解决方案

    前段时间做了一个浮层,但在ios上,浮层滑动不流畅,基本上是随着手指的移动而移动,经研究加上-webkit-overflow-scrolling: touch即可 eg: <!DOCTYPE h ...

  5. 蓝色科技AE宣传片头光晕视频

    蓝色科技AE宣传片头光晕视频素材,蓝色AE炫光素材,科技AE片头,精美,AE特效,绚丽,AE模板,视频素材,动画. 地址:http://www.huiyi8.com/xuanguang/ae/

  6. BZOJ 3400 [Usaco2009 Mar]Cow Frisbee Team 奶牛沙盘队:dp【和为f的倍数】

    题目链接:http://begin.lydsy.com/JudgeOnline/problem.php?id=1375 题意: 给你n个数,你可以从中选任意多个,但不能不选.问你所选数字之和为f的倍数 ...

  7. tensorflow实现svm iris二分类——本质上在使用梯度下降法求解线性回归(loss是定制的而已)

    iris二分类 # Linear Support Vector Machine: Soft Margin # ---------------------------------- # # This f ...

  8. Ice php配置

    1) Removed the php extension directories and recompiled apache/PHP2) Rebooted the machine.3) I remov ...

  9. Unity-2017.3官方实例教程Space-Shooter(二)

    由于初学Unity,写下此文作为笔记,文中难免会有疏漏,不当之处还望指正. Unity-2017.3官方实例教程Space-Shooter(一) 章节列表: 一.创建小行星Prefab 二.创建敌机和 ...

  10. MySQL记录_20160919

    1.首先先看下什么是MySQL. MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品.MySQL 最流行的关系型数据库管理系统,其开放源码这一特点 ...