[CF1045C]Hyperspace Highways
题目大意:给一张$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相关推荐
- CF1045C Hyperspace Highways(圆方树板子)
CF1045C Hyperspace Highways 题目大意 给一张 n n n个点 m m m条边的图,保证若有一个环,一定是完全子图,多次询两个点之间的最短路径长度. 题解 如果会圆方树的可以 ...
- Codeforces 1045C Hyperspace Highways (看题解) 圆方树
学了一下圆方树, 好神奇的东西呀. #include<bits/stdc++.h> #define LL long long #define fi first #define se sec ...
- CodeForces1046B Hyperspace Highways
传送门 题意: N个点,M条边,每一个环上的点两两有边相连.q次询问两点间最短距离. 题解: 构造圆方树,那么两点间距离感性认知一下就可以发现是树上两点间距离的一半.然后 dist(u,v)=(dep ...
- UVa 1393 (容斥原理、GCD) Highways
题意: 给出一个n行m列的点阵,求共有多少条非水平非竖直线至少经过其中两点. 分析: 首先说紫书上的思路,编程较简单且容易理解.由于对称性,所以只统计"\"这种线型的,最后乘2即是 ...
- POJ 2485 - Highways(求最小生成树的最大权值-Kruskal算法)
题目 Language:Default Highways Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 36414 Accept ...
- 【POJ 2485】 Highways
[POJ 2485] Highways 最小生成树模板 Prim #includeusing namespace std;int mp[501][501]; int dis[501]; bool vi ...
- POJ 2485 Highways(最小生成树 Prim)
Highways 大意:给你一个用邻接矩阵形式存储的有n个顶点的无向图,让你求它的最小生成树并求出在这个生成树里面最大的边的权值. 思路:用Prim求,判断条件改一下就行. PS:dis数组初始化 ...
- 【POJ - 2485 】Highways (最小生成树,Prim算法,瓶颈生成树)
题干: The island nation of Flatopia is perfectly flat. Unfortunately, Flatopia has no public highways. ...
- 【POJ - 1751】Highways (最小生成树)
题干: The island nation of Flatopia is perfectly flat. Unfortunately, Flatopia has a very poor system ...
最新文章
- 使用javascript让项目支持热插拔
- 在线实时大数据平台Storm输入源共享试验
- 统计分组的原则是要体现什么_统计学简答题
- hdu 3038(种类并查集)
- 问鼎五岳之巅--Java开发手册泰山版心得分享
- Linq的简介和基础知识学习
- java 中格式化小数位数
- 使用Directory.EnumerateFiles进行批处理
- 分式化简结果要求_初二数学期末复习,分式考点归纳,考点较多,解答要谨慎...
- python2.7手机版下载_Python 2.7 64位2.7.13 安装版 下载 - 51下载网
- 2014年即将过去,2015年即将到来
- mysql+join+合计_图解MySQL里的各种 JOIN,看完不懂来找我!
- h5支付回调返回值是什么 php_微信HTML5网页支付PHP + JS API总结
- windows sesrver2003下搭建DHCP服务器
- ssm-学子商城-项目第十三天最后一天完成项目
- QT 网络编程之https
- Python 金融量化 道路突破策略(唐奇安道路突破策略布林带通道及其市场风险)
- 普及组noip2015年问题求解——重新排列1234和根节点数为2015的二叉树最多有__个叶子节点
- OpenGL第十讲——像素图
- MATLAB三维绘图(三)绘制等值线图
热门文章
- 如何选择适合自己的实验室信息管理系统LIMS?
- 云时代的弄潮儿Marc Benioff
- 只能干杂活?为啥网工总是被人看不起?
- C语言程序设计教程蒋清明,C语言程序设计
- 一网友在上海的感受,太惊人的了,也太现实了,不得不看......
- Python列表及如何使用列表元素
- 客户端调用网关服务“网络请求错误“
- 科技日新月异带来的影响
- I’ve Got Your Back(gammon)
- ABAQUS单位制/常用单位对照表/单位换算