题目大意:给一张$n$个点$m$条边的图,保证若有一个环,一定是完全子图,多次询问两个点之间的最短路径长度

题解:把完全子图缩成一个点,圆方树,方点权值设成$1$,圆点设成$0$即可。

卡点:数组开小

C++ Code:

#include <cstdio>
#include <algorithm>
#define maxn 100010
#define maxm 500010
inline int min(int a, int b) {return a < b ? a : b;}
inline int max(int a, int b) {return a > b ? a : b;}namespace Tree {int head[maxn << 1], cnt;struct Edge {int to, nxt;} e[maxn << 2];inline void addE(int a, int b) {e[++cnt] = (Edge) {b, head[a]}; head[a] = cnt;e[++cnt] = (Edge) {a, head[b]}; head[b] = cnt;}#define M 19int nodenum, n;int dep[maxn << 1], sum[maxn << 1], fa[M][maxn << 1];void dfs(int u) {for (int i = 1; i < M; i++) fa[i][u] = fa[i - 1][fa[i - 1][u]];for (int i = head[u]; i; i = e[i].nxt) {int v = e[i].to;if (v != fa[0][u]) {fa[0][v] = u; dep[v] = dep[u] + 1;sum[v] = sum[u] + (v > n);dfs(v);}}}inline int LCA(int x, int y) {if (x == y) return x;if (dep[x] < dep[y]) std::swap(x, y);for (int i = dep[x] - dep[y]; i; i &= i - 1) x = fa[__builtin_ctz(i)][x];if (x == y) return x;for (int i = M - 1; ~i; i--) if (fa[i][x] != fa[i][y]) x = fa[i][x], y = fa[i][y];return fa[0][x];}inline int ask(int x, int y) {int lca = LCA(x, y);return sum[x] + sum[y] - (sum[lca] << 1) + (lca > n);}void init(int __n) {n = __n;sum[1] = 0;dfs(1);}#undef M
}namespace Graph {int head[maxn], cnt;struct Edge {int to, nxt;} e[maxm << 1];inline void addE(int a, int b) {e[++cnt] = (Edge) {b, head[a]}; head[a] = cnt;e[++cnt] = (Edge) {a, head[b]}; head[b] = cnt;}using Tree::nodenum;int DFN[maxn], low[maxn], idx;int S[maxn], top;void tarjan(int u) {DFN[u] = low[u] = ++idx;S[++top] = u;for (int i = head[u]; i; i = e[i].nxt) {int v = e[i].to;if (!DFN[v]) {tarjan(v);low[u] = min(low[u], low[v]);if (low[v] >= DFN[u]) {nodenum++;Tree::addE(nodenum, u);do {v = S[top--];Tree::addE(nodenum, v);} while (v != e[i].to);}} else low[u] = min(low[u], DFN[v]);}}void init(int n) {tarjan(1);Tree::init(n);}
}int n, m, Q;
int main() {scanf("%d%d%d", &n, &m, &Q); Tree::nodenum = Tree::n = n;for (int i = 0, a, b; i < m; i++) {scanf("%d%d", &a, &b);Graph::addE(a, b);}Graph::init(n);while (Q --> 0) {int u, v;scanf("%d%d", &u, &v);printf("%d\n", Tree::ask(u, v));}return 0;
}

  

转载于:https://www.cnblogs.com/Memory-of-winter/p/9777914.html

[CF1045C]Hyperspace Highways相关推荐

  1. CF1045C Hyperspace Highways(圆方树板子)

    CF1045C Hyperspace Highways 题目大意 给一张 n n n个点 m m m条边的图,保证若有一个环,一定是完全子图,多次询两个点之间的最短路径长度. 题解 如果会圆方树的可以 ...

  2. Codeforces 1045C Hyperspace Highways (看题解) 圆方树

    学了一下圆方树, 好神奇的东西呀. #include<bits/stdc++.h> #define LL long long #define fi first #define se sec ...

  3. CodeForces1046B Hyperspace Highways

    传送门 题意: N个点,M条边,每一个环上的点两两有边相连.q次询问两点间最短距离. 题解: 构造圆方树,那么两点间距离感性认知一下就可以发现是树上两点间距离的一半.然后 dist(u,v)=(dep ...

  4. UVa 1393 (容斥原理、GCD) Highways

    题意: 给出一个n行m列的点阵,求共有多少条非水平非竖直线至少经过其中两点. 分析: 首先说紫书上的思路,编程较简单且容易理解.由于对称性,所以只统计"\"这种线型的,最后乘2即是 ...

  5. POJ 2485 - Highways(求最小生成树的最大权值-Kruskal算法)

    题目 Language:Default Highways Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 36414 Accept ...

  6. 【POJ 2485】 Highways

    [POJ 2485] Highways 最小生成树模板 Prim #includeusing namespace std;int mp[501][501]; int dis[501]; bool vi ...

  7. POJ 2485 Highways(最小生成树 Prim)

    Highways   大意:给你一个用邻接矩阵形式存储的有n个顶点的无向图,让你求它的最小生成树并求出在这个生成树里面最大的边的权值. 思路:用Prim求,判断条件改一下就行. PS:dis数组初始化 ...

  8. 【POJ - 2485 】Highways (最小生成树,Prim算法,瓶颈生成树)

    题干: The island nation of Flatopia is perfectly flat. Unfortunately, Flatopia has no public highways. ...

  9. 【POJ - 1751】Highways (最小生成树)

    题干: The island nation of Flatopia is perfectly flat. Unfortunately, Flatopia has a very poor system ...

最新文章

  1. 使用javascript让项目支持热插拔
  2. 在线实时大数据平台Storm输入源共享试验
  3. 统计分组的原则是要体现什么_统计学简答题
  4. hdu 3038(种类并查集)
  5. 问鼎五岳之巅--Java开发手册泰山版心得分享
  6. Linq的简介和基础知识学习
  7. java 中格式化小数位数
  8. 使用Directory.EnumerateFiles进行批处理
  9. 分式化简结果要求_初二数学期末复习,分式考点归纳,考点较多,解答要谨慎...
  10. python2.7手机版下载_Python 2.7 64位2.7.13 安装版 下载 - 51下载网
  11. 2014年即将过去,2015年即将到来
  12. mysql+join+合计_图解MySQL里的各种 JOIN,看完不懂来找我!
  13. h5支付回调返回值是什么 php_微信HTML5网页支付PHP + JS API总结
  14. windows sesrver2003下搭建DHCP服务器
  15. ssm-学子商城-项目第十三天最后一天完成项目
  16. QT 网络编程之https
  17. Python 金融量化 道路突破策略(唐奇安道路突破策略布林带通道及其市场风险)
  18. 普及组noip2015年问题求解——重新排列1234和根节点数为2015的二叉树最多有__个叶子节点
  19. OpenGL第十讲——像素图
  20. MATLAB三维绘图(三)绘制等值线图

热门文章

  1. 如何选择适合自己的实验室信息管理系统LIMS?
  2. 云时代的弄潮儿Marc Benioff
  3. 只能干杂活?为啥网工总是被人看不起?
  4. C语言程序设计教程蒋清明,C语言程序设计
  5. 一网友在上海的感受,太惊人的了,也太现实了,不得不看......
  6. Python列表及如何使用列表元素
  7. 客户端调用网关服务“网络请求错误“
  8. 科技日新月异带来的影响
  9. I’ve Got Your Back(gammon)
  10. ABAQUS单位制/常用单位对照表/单位换算