题目链接 Connections between cities

LCA的模板题啦。

 #include <bits/stdc++.h>

 using namespace std;

 #define REP(i,n)        for(int i(0); i <  (n); ++i)
#define rep(i,a,b) for(int i(a); i <= (b); ++i)
#define dec(i,a,b) for(int i(a); i >= (b); --i)
#define for_edge(i,x) for(int i = H[x]; i; i = X[i]) const int N = + ;
const int A = + ; int father[N], List[N], deep[N], E[N], X[N], H[N], V[N];
int f[N][A], g[N][A];
bool v[N];
int n, m, q, x, y, z;
int et; inline void Eddedge(int a, int b, int c){
E[++et] = b, X[et] = H[a], H[a] = et, V[et] = c;
E[++et] = a, X[et] = H[b], H[b] = et, V[et] = c;
} int getfather(int x){ return father[x] ? father[x] = getfather(father[x]) : x; } int Calc(int a, int b){
int ret = ; if (deep[a] < deep[b]) swap(a, b);
for (int i = , delta = deep[a] - deep[b]; delta; delta >>= , ++i)
if (delta & ) ret += g[a][i], a = f[a][i]; if (a == b) return ret; dec(i, , ) if (f[a][i] != f[b][i]){
ret += g[a][i];
ret += g[b][i];
a = f[a][i];
b = f[b][i];
} ret += g[a][];
ret += g[b][]; return ret;
} int main(){ while (~scanf("%d%d%d", &n, &m, &q)){ et = ;
memset(father, , sizeof father);
memset(H, , sizeof H); rep(i, , m){
scanf("%d%d%d", &x, &y, &z);Eddedge(x, y, z);
int fa = getfather(x), fb = getfather(y);
father[fa] = fb;
} int l = , r = , now = ;
memset(List, , sizeof List);
memset(deep, , sizeof deep);
memset(v, false , sizeof v);
memset(f, , sizeof f);
memset(g, , sizeof g); rep(p, , n) if (!v[p]){
for (l = , r = , v[p] = true, List[] = p; l <= r; ++l){
now = List[l];
for_edge(i, now) if (!v[E[i]]){
v[E[i]] = true;
f[E[i]][] = now;
g[E[i]][] = V[i];
deep[E[i]] = deep[now] + ; for (int j = ; f[E[i]][j]; ++j)
f[E[i]][j + ] = f[f[E[i]][j]][j],
g[E[i]][j + ] = g[E[i]][j] + g[f[E[i]][j]][j]; List[++r] = E[i];
}
}
} while (q--){
scanf("%d%d", &x, &y);
int fa = getfather(x), fb = getfather(y);
if (fa != fb) puts("Not connected"); else printf("%d\n", Calc(x, y));
} } return ; }

HDU 2874 Connections between cities(LCA)的更多相关文章

  1. HDU 2874 Connections between cities(LCA(离线、在线)求树上距离+森林)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2874 题目大意:给出n个点,m条边,q个询问,每次询问(u,v)的最短距离,若(u,v)不连通即不在同 ...

  2. HDU 2874 Connections between cities(LCA离线算法实现)

    http://acm.hdu.edu.cn/showproblem.php?pid=2874 题意: 求两个城市之间的距离. 思路: LCA题,注意原图可能不连通. 如果不了解离线算法的话,可以看我之 ...

  3. HDU 2874 Connections between cities(LCA+并查集)

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=2874 [题目大意] 有n个村庄,m条路,不存在环,有q个询问,问两个村庄是否可达, 如果可达则输出 ...

  4. hdu 2874 Connections between cities(st&rmq LCA)

    Connections between cities Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (J ...

  5. 【HDU 2874】Connections between cities(LCA)

    dfs找出所有节点所在树及到树根的距离及深度及父亲. i和j在一棵树上,则最短路为dis[i]+dis[j]-dis[LCA(i,j)]*2. #include <cstring> #in ...

  6. Connections between cities(LCA)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2874 题目: Problem Description After World War X, a lot ...

  7. hdu 2874 Connections between cities [LCA] (lca->rmq)

    Connections between cities Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (J ...

  8. HDU 2874 Connections between cities(LCA Tarjan)

    Connections between cities [题目链接]Connections between cities [题目类型]LCA Tarjan &题意: 输入一个森林,总节点不超过N ...

  9. hdu 2874 Connections between cities 带权lca判是否联通

    Connections between cities Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (J ...

随机推荐

  1. VMware虚拟网卡介绍和使用说明

    介绍VMware三种网络连接模式的详细配置及规则 版权声明:本文为博主原创文章,未经博主允许不得转载. 原文地址: https://www.cnblogs.com/poterliu/p/9455391 ...

  2. stm32启动地址

    理论上,CM3中规定上电后CPU是从0地址开始执行,但是这里中断向量表却被烧写在0x0800 0000地址里(Flash memory启动方式),那启动时不就找不到中断向量表了?既然CM3定下的规矩是 ...

  3. STM8时基单元

    STM8时基单元 时基单元包含: 16位向上/向下计数器 16位自动重载寄存器 重复计数器 预分频器 (图29:STM8 时基单元) 16位计数器,预分频器,自动重载寄存器和重复计数器寄存器都可以通过 ...

  4. linux中的部分宏

    *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; } /* ...

  5. body标签相关

    03-body标签中相关标签   今日主要内容: 列表标签 <ul>.<ol>.<dl> 表格标签 <table> 表单标签 <fom> 一 ...

  6. 29、在android中采用动画方案来弹出窗口

    1.自定义style 2.使用方法: buttonWhat.setOnClickListener(new OnClickListener() { @Override public void onCli ...

  7. 前端PS切图技巧

    先选择“编辑”-“首选项” 打开,找到“参考线”    设置一下每格网格 100像素 5个细块 确定后 ctrl+‘ 出现网格.(通过网格对齐切图比用参考线切图更好). 如果使用PS cc的软件的话, ...

  8. 2.新手必须掌握的Linux命令

    第2章 新手必须掌握的Linux命令 章节简述: 本章首先介绍系统内核和Shell终端的关系与作用,然后介绍Bash解释器的4大优势并学习Linux命令的执行方法.经验丰富的运维人员可以通过合理地组合 ...

  9. Leetcode27--->Remove Element(移除数组中给定元素)

    题目:给定一个数组array和一个值value,移除掉数组中所有与value值相等的元素,返回新的数组的长度:要求:不能分配额外的数组空间,且必须使用原地排序的思想,空间复杂度O(1); 举例: Gi ...

  10. day01_07.逻辑与字符串运算符

    &&(并且)====>发现&符号总是打错,记忆口令:&7(暗器),在数字7上面,在python中是and ||(或者)====>在python中是or . ...