[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 19
- int 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;
- }
[CF1045C]Hyperspace Highways的更多相关文章
- Codeforces 1045C Hyperspace Highways (看题解) 圆方树
学了一下圆方树, 好神奇的东西呀. #include<bits/stdc++.h> #define LL long long #define fi first #define se sec ...
- codeforce1046 Bubble Cup 11 - Finals 题解
比赛的时候开G开了3h结果rose说一句那唯一一个AC的是羊的心态就崩了.. 这套题感觉质量挺好然后就back了下 A: AI robots 有三个限制条件:相互能够看见和智商的差.使用主席树,可以维 ...
- Bubble Cup 11 - Finals [Online Mirror, Div. 1]题解 【待补】
Bubble Cup 11 - Finals [Online Mirror, Div. 1] 一场很好玩的题啊! I. Palindrome Pairs 枚举哪种字符出现奇数次. G. AI robo ...
- H:Highways
总时间限制: 1000ms 内存限制: 65536kB描述The island nation of Flatopia is perfectly flat. Unfortunately, Flatopi ...
- Highways(prim & MST)
Highways Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 23421 Accepted: 10826 Descri ...
- poj2485 Highways
Description The island nation of Flatopia is perfectly flat. Unfortunately, Flatopia has no public h ...
- hdu 4666:Hyperspace(最远曼哈顿距离 + STL使用)
Hyperspace Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others)Tota ...
- poj 2485 Highways 最小生成树
点击打开链接 Highways Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 19004 Accepted: 8815 ...
- poj 2485 Highways
题目连接 http://poj.org/problem?id=2485 Highways Description The island nation of Flatopia is perfectly ...
随机推荐
- Dijkstra&&Floyd
文章来源:(http://www.cnblogs.com/biyeymyhjob/archive/2012/07/31/2615833.html) (以下内容皆为转载) Dijkstra算法 1.定义 ...
- lintcode_177_把排序数组转换为高度最小的二叉搜索树
把排序数组转换为高度最小的二叉搜索树 描述 笔记 数据 评测 给一个排序数组(从小到大),将其转换为一棵高度最小的排序二叉树. 注意事项 There may exist multiple vali ...
- MongoDB的Go语言驱动注意点
当我们定义一个struct用来和集合对应时,要注意结构体的字段首字母应该大写,不然不可见. 通过`bson:"name"`这种方式可以定义MongoDB中集合的字段名,如果不定义, ...
- Retrofit get post query filed FiledMap
直接请求型 1.如果是直接请求某一地址,写法如下: @GET("/record") Call getResult(); 2.如果是组合后直接请求,如/result/{id}写法如下 ...
- 如何在一个顶级域名下用两个二级域名访问vps下的两个项目网站--完美解决骗
本人是原址是http://www.webzhe.com/server/340 后经过本人的实践修改,增加截图,等具体的步骤,完美解决 如何在vps中设置二级域名开通子网站,这个问题涉及到两步:一首先要 ...
- USACO Section2.3 Controlling Companies 解题报告 【icedream61】
concom解题报告------------------------------------------------------------------------------------------ ...
- Python 3基础教程14-在文件尾部更新内容
本文介绍在一个已经存在的文件尾部添加内容,还是用到write方法. 这里exampleFile.txt是前面文件创建的文件,里面有两行文字.
- Abstract Factory 抽象工厂(创建型模式)
1.常规的对象创建方法(以更换QQ空间主题为例) (这里的常规对象指的是由于业务需求,当前实例化的对象有可能被其他相似的对象(有着共同的特性)所取代,例如更换手机铃声:一首歌取代另一首歌(词,曲,和声 ...
- Python全栈工程师
ParisGabriel Python 入门基础 print(“hello world”)变量 : 存储信息的,日后被调用.修改操作常量: 固定不变的量,字母大写命名规则:1. 字母数 ...
- 孤荷凌寒自学python第五十八天成功使用python来连接上远端MongoDb数据库
孤荷凌寒自学python第五十八天成功使用python来连接上远端MongoDb数据库 (完整学习过程屏幕记录视频地址在文末) 今天是学习mongoDB数据库的第四天.今天的感觉是,mongoDB数据 ...