题目链接


刚开始拿到这道题的时候,先写了Tarjan缩点构树,没过样例,但是先把40分拿到了。

然后再想,就如同样例给出的那样,我们所定义的原点和方点,实际上在Tarjan直接缩点上并不能起到直接体现的作用,所以这里要用到一般图的圆方树模板了,就是一道模板题了,直接上广义圆方树,然后求一个LCA即可。

#include <iostream>
#include <cstdio>
#include <cmath>
#include <string>
#include <cstring>
#include <algorithm>
#include <limits>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <bitset>
//#include <unordered_map>
//#include <unordered_set>
#define lowbit(x) ( x&(-x) )
#define pi 3.141592653589793
#define e 2.718281828459045
#define INF 0x3f3f3f3f3f3f3f3f
#define HalF (l + r)>>1
#define lsn rt<<1
#define rsn rt<<1|1
#define Lson lsn, l, mid
#define Rson rsn, mid+1, r
#define QL Lson, ql, qr
#define QR Rson, ql, qr
#define myself rt, l, r
using namespace std;
typedef unsigned long long ull;
typedef unsigned int uit;
typedef long long ll;
const int maxN = 1e6 + 7, maxM = 2e6 + 7;
int N, M, Q;
struct Graph
{int head[maxN], cnt;struct Eddge{int nex, to;Eddge(int a=-1, int b=0):nex(a), to(b) {}} edge[maxM << 1];inline void addEddge(int u, int v){edge[cnt] = Eddge(head[u], v);head[u] = cnt++;}inline void _add(int u, int v) { addEddge(u, v); addEddge(v, u); }inline void init(){cnt = 0;for(int i=1; i<=N; i++) head[i] = -1;}
} Old, Now;
int dfn[maxN], tot, low[maxN], Stap[maxN], Stop, Belong[maxN], Bcnt;
void Tarjan(int u, int fa)
{dfn[u] = low[u] = ++tot;Stap[++Stop] = u;for(int i=Old.head[u], v, p; ~i; i=Old.edge[i].nex){v = Old.edge[i].to;if(v == fa) continue;if(!dfn[v]){Tarjan(v, u);low[u] = min(low[u], low[v]);if(low[v] >= dfn[u]){Bcnt++; Now.head[Bcnt + N] = -1;do{p = Stap[Stop--];Now._add(p, N + Bcnt);} while(p ^ v);Now._add(u, N + Bcnt);}}else low[u] = min(low[u], dfn[v]);}
}
int deep[maxN], Fpoint[maxN], root[maxN][22], LOG2[maxN];
void dfs(int u, int fa)
{deep[u] = deep[fa] + 1; Fpoint[u] = Fpoint[fa] + (u > N ? 1 : 0); root[u][0] = fa;for(int i=0; (1 << (i + 1)) < N; i++) root[u][i + 1] = root[root[u][i]][i];for(int i=Now.head[u], v; ~i; i=Now.edge[i].nex){v = Now.edge[i].to;if(v == fa) continue;dfs(v, u);}
}
inline int _LCA(int u, int v)
{if(deep[u] < deep[v]) swap(u, v);int det = deep[u] - deep[v];for(int i=LOG2[det]; i>=0; i--){if((det >> i) & 1) u = root[u][i];}if(u == v) return u;for(int i=LOG2[N]; i>=0; i--){if(root[u][i] ^ root[v][i]){u = root[u][i];v = root[v][i];}}return root[u][0];
}
inline void init()
{tot = Stop = Bcnt = 0;Old.init(); Now.init();for(int i = 1, j = 2, k = 0; i <= 2 * N; i++){if(i == j) { k++; j <<= 1; }LOG2[i] = k;}
}
int main()
{scanf("%d%d", &N, &M);init();for(int i=1, u, v; i<=M; i++){scanf("%d%d", &u, &v);Old._add(u, v);}for(int i=1; i<=N; i++) if(!dfn[i]) Tarjan(i, 0);deep[0] = 0;dfs(1, 0);scanf("%d", &Q);int u, v, lca, dis, fpt;while(Q--){scanf("%d%d", &u, &v);lca = _LCA(u, v);dis = deep[u] + deep[v] - deep[lca] - deep[root[lca][0]];fpt = Fpoint[u] + Fpoint[v] - Fpoint[lca] - Fpoint[root[lca][0]];printf("%d\n", dis - fpt);}return 0;
}

道路相遇【一般图的圆方树-广义圆方树】相关推荐

  1. [学习笔记]圆方树广义圆方树

    引入 偶尔,我们会遇到一些要在无向图/仙人掌上做的问题,这些问题如果在树上就会比较方便,那么我们就开始考虑能不能把原图等效成一棵树,然后就可以方便地乱搞了? 圆方树就是一种将无向图/仙人掌变成树的数据 ...

  2. 【知识小结】圆方树 广义圆方树

    关于仙人掌的总结 immortalCO的博客 yyb的博客 模板 namespace T{vector <int> e[maxn * 2];int tag[maxn * 2];void a ...

  3. 【luogu P4320】道路相遇(圆方树)

    道路相遇 题目链接:luogu P4320 题目大意 给你一个无向连通图,无重边自环,然后每次给你两点,问你有多少个点是两点间路径必有的. 思路 圆方树pre模板题? 圆方树怎么做这里不说,看铁人两项 ...

  4. 广义圆方树+树链剖分+set(Codeforces Round #278 (Div. 1): E. Tourists)

    前置:双联通分量.圆方树.树链剖分 什是是广义圆方树 圆方树是针对于仙人掌建树,而广义圆方树是针对无向图建树,对于一个无向图 无向图中的所有点 → 广义圆方树中的所有圆点 无向图中的一个双联通分量 → ...

  5. BZOJ3331 [BeiJing2013]压力 广义圆方树

    3331: [BeiJing2013]压力 Description 如今,路由器和交换机构建起了互联网的骨架.处在互联网的骨干位置的核心路由器典型的要处理100Gbit/s的网络流量.他们每天都生活在 ...

  6. 点双联通分量,圆方树和广义圆方树

    点双联通分量 边双联通分量想必看这篇博客的同学就会,并且边双联通分量理解和打起来比较简单,就不再赘述了. 点双联通分量,类比边双的定义,它是原图的极大无向子图,满足删去子图中任意一个节点以及与其相邻的 ...

  7. Fantasia 【HDU - 5739】【广义圆方树】

    题目链接 这道题的题意在这里就不展开了,因为这次的英文比较的好读,也没有生词,好懂一些些hh. 然后,这道题的关键点,肯定就是来看这个点是不是一个割点,也就是割去这个点之后就将原来的联通块展开成两个以 ...

  8. 动图之一个圆绕另一个圆转动

    已知圆1与圆2,圆2不动,圆1绕圆2转一圈,圆1自转多少圈? 答:圆1的圆心走了 2 π ( r 1 + r 2 ) 2\pi(r_1+r_2) 2π(r1​+r2​),圆1自转了的路程也是 2 π ...

  9. 道路交通事故现场计算机制图,GA 49-2014_道路交通事故现场图绘制.pdf 文档全文预览...

    ICS13.200 R81 中华人民共和国公共安全行业标准 - GA49 2014 代替 - GA49 2009 道路交通事故现场图绘制 Drawin ofthesceneforroadtraffic ...

最新文章

  1. NESPER的大体结构 z
  2. android button背景随心搭配
  3. oracle 查询各科前3名_好消息!新世纪女排教练战绩排名出炉,前3名中国人占据两席...
  4. aspx页面与ascx控件脚本冲突的问题
  5. 4分钟训练ImageNet!腾讯机智创造AI训练世界纪录
  6. MSDN电子杂志上有关TFS的文章
  7. WEB标准学习路程之CSS:7.表格,滚动条,打印
  8. 这样的书 我改怎么起名呢?
  9. 吴裕雄--天生自然 JAVASCRIPT开发学习:HTML DOM 集合(Collection)
  10. php求圆柱体积,认识圆柱体a href=http://ruiwen.com/friend/list.php(教师中心专稿)/a -- 小学数学教学资源网...
  11. springboot基于java的邮件收发管理系统毕业设计源码101025
  12. ROS学习【3】-----ROS通信编程:小乌龟走正方形
  13. 07 巧算指数温度--参考即可不用算
  14. 显卡和CPU的关系像“主仆”,GPU的工作原理是什么
  15. 学位认证上‘学位网’办理即可
  16. ArrayList和LinkedList时间、空间复杂度对比
  17. Drools学习笔记4-第一个例子
  18. 云服务器的主要性能参数,云服务器参数到配置,一文让您从小白到高手
  19. [转] 一百本名著中的一百句话
  20. 关于win10连网显示“网络使用较旧的安全标准。建议连接到其他网络”的解决方法

热门文章

  1. 汽车无钥匙进入系统原理是什么
  2. nginx双向认证配置及验证-脚本实现制作证书过程及浏览器验证遇到的一些问题解决
  3. java数组删除元素_java中删除 数组中的指定元素方法
  4. Eclipse搭建简单的Spring框架
  5. ubuntu安装vtk
  6. Linux系统查询磁盘空间大小(df、du)
  7. 3D建模需不需要手绘板?看看热心网友怎么说
  8. python模拟linux键盘上键和回车_linux系统运维,挂载和分区概念太难?在虚机下操作一次全掌握...
  9. Unity脚本与优化
  10. 中小企业数字化转型研究报告(2022)学习分享