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

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

卡点:数组开小

C++ Code:

  1. #include <cstdio>
  2. #include <algorithm>
  3. #define maxn 100010
  4. #define maxm 500010
  5. inline int min(int a, int b) {return a < b ? a : b;}
  6. inline int max(int a, int b) {return a > b ? a : b;}
  7.  
  8. namespace Tree {
  9. int head[maxn << 1], cnt;
  10. struct Edge {
  11. int to, nxt;
  12. } e[maxn << 2];
  13. inline void addE(int a, int b) {
  14. e[++cnt] = (Edge) {b, head[a]}; head[a] = cnt;
  15. e[++cnt] = (Edge) {a, head[b]}; head[b] = cnt;
  16. }
  17.  
  18. #define M 19
  19. int nodenum, n;
  20. int dep[maxn << 1], sum[maxn << 1], fa[M][maxn << 1];
  21. void dfs(int u) {
  22. for (int i = 1; i < M; i++) fa[i][u] = fa[i - 1][fa[i - 1][u]];
  23. for (int i = head[u]; i; i = e[i].nxt) {
  24. int v = e[i].to;
  25. if (v != fa[0][u]) {
  26. fa[0][v] = u; dep[v] = dep[u] + 1;
  27. sum[v] = sum[u] + (v > n);
  28. dfs(v);
  29. }
  30. }
  31. }
  32. inline int LCA(int x, int y) {
  33. if (x == y) return x;
  34. if (dep[x] < dep[y]) std::swap(x, y);
  35. for (int i = dep[x] - dep[y]; i; i &= i - 1) x = fa[__builtin_ctz(i)][x];
  36. if (x == y) return x;
  37. for (int i = M - 1; ~i; i--) if (fa[i][x] != fa[i][y]) x = fa[i][x], y = fa[i][y];
  38. return fa[0][x];
  39. }
  40. inline int ask(int x, int y) {
  41. int lca = LCA(x, y);
  42. return sum[x] + sum[y] - (sum[lca] << 1) + (lca > n);
  43. }
  44. void init(int __n) {
  45. n = __n;
  46. sum[1] = 0;
  47. dfs(1);
  48. }
  49. #undef M
  50. }
  51.  
  52. namespace Graph {
  53. int head[maxn], cnt;
  54. struct Edge {
  55. int to, nxt;
  56. } e[maxm << 1];
  57. inline void addE(int a, int b) {
  58. e[++cnt] = (Edge) {b, head[a]}; head[a] = cnt;
  59. e[++cnt] = (Edge) {a, head[b]}; head[b] = cnt;
  60. }
  61.  
  62. using Tree::nodenum;
  63. int DFN[maxn], low[maxn], idx;
  64. int S[maxn], top;
  65. void tarjan(int u) {
  66. DFN[u] = low[u] = ++idx;
  67. S[++top] = u;
  68. for (int i = head[u]; i; i = e[i].nxt) {
  69. int v = e[i].to;
  70. if (!DFN[v]) {
  71. tarjan(v);
  72. low[u] = min(low[u], low[v]);
  73. if (low[v] >= DFN[u]) {
  74. nodenum++;
  75. Tree::addE(nodenum, u);
  76. do {
  77. v = S[top--];
  78. Tree::addE(nodenum, v);
  79. } while (v != e[i].to);
  80. }
  81. } else low[u] = min(low[u], DFN[v]);
  82. }
  83. }
  84. void init(int n) {
  85. tarjan(1);
  86. Tree::init(n);
  87. }
  88. }
  89.  
  90. int n, m, Q;
  91. int main() {
  92. scanf("%d%d%d", &n, &m, &Q); Tree::nodenum = Tree::n = n;
  93. for (int i = 0, a, b; i < m; i++) {
  94. scanf("%d%d", &a, &b);
  95. Graph::addE(a, b);
  96. }
  97. Graph::init(n);
  98. while (Q --> 0) {
  99. int u, v;
  100. scanf("%d%d", &u, &v);
  101. printf("%d\n", Tree::ask(u, v));
  102. }
  103. return 0;
  104. }

  

[CF1045C]Hyperspace Highways的更多相关文章

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

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

  2. codeforce1046 Bubble Cup 11 - Finals 题解

    比赛的时候开G开了3h结果rose说一句那唯一一个AC的是羊的心态就崩了.. 这套题感觉质量挺好然后就back了下 A: AI robots 有三个限制条件:相互能够看见和智商的差.使用主席树,可以维 ...

  3. Bubble Cup 11 - Finals [Online Mirror, Div. 1]题解 【待补】

    Bubble Cup 11 - Finals [Online Mirror, Div. 1] 一场很好玩的题啊! I. Palindrome Pairs 枚举哪种字符出现奇数次. G. AI robo ...

  4. H:Highways

    总时间限制: 1000ms 内存限制: 65536kB描述The island nation of Flatopia is perfectly flat. Unfortunately, Flatopi ...

  5. Highways(prim & MST)

    Highways Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 23421   Accepted: 10826 Descri ...

  6. poj2485 Highways

    Description The island nation of Flatopia is perfectly flat. Unfortunately, Flatopia has no public h ...

  7. hdu 4666:Hyperspace(最远曼哈顿距离 + STL使用)

    Hyperspace Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)Tota ...

  8. poj 2485 Highways 最小生成树

    点击打开链接 Highways Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 19004   Accepted: 8815 ...

  9. poj 2485 Highways

    题目连接 http://poj.org/problem?id=2485 Highways Description The island nation of Flatopia is perfectly ...

随机推荐

  1. Dijkstra&&Floyd

    文章来源:(http://www.cnblogs.com/biyeymyhjob/archive/2012/07/31/2615833.html) (以下内容皆为转载) Dijkstra算法 1.定义 ...

  2. lintcode_177_把排序数组转换为高度最小的二叉搜索树

    把排序数组转换为高度最小的二叉搜索树   描述 笔记 数据 评测 给一个排序数组(从小到大),将其转换为一棵高度最小的排序二叉树. 注意事项 There may exist multiple vali ...

  3. MongoDB的Go语言驱动注意点

    当我们定义一个struct用来和集合对应时,要注意结构体的字段首字母应该大写,不然不可见. 通过`bson:"name"`这种方式可以定义MongoDB中集合的字段名,如果不定义, ...

  4. Retrofit get post query filed FiledMap

    直接请求型 1.如果是直接请求某一地址,写法如下: @GET("/record") Call getResult(); 2.如果是组合后直接请求,如/result/{id}写法如下 ...

  5. 如何在一个顶级域名下用两个二级域名访问vps下的两个项目网站--完美解决骗

    本人是原址是http://www.webzhe.com/server/340 后经过本人的实践修改,增加截图,等具体的步骤,完美解决 如何在vps中设置二级域名开通子网站,这个问题涉及到两步:一首先要 ...

  6. USACO Section2.3 Controlling Companies 解题报告 【icedream61】

    concom解题报告------------------------------------------------------------------------------------------ ...

  7. Python 3基础教程14-在文件尾部更新内容

    本文介绍在一个已经存在的文件尾部添加内容,还是用到write方法. 这里exampleFile.txt是前面文件创建的文件,里面有两行文字.

  8. Abstract Factory 抽象工厂(创建型模式)

    1.常规的对象创建方法(以更换QQ空间主题为例) (这里的常规对象指的是由于业务需求,当前实例化的对象有可能被其他相似的对象(有着共同的特性)所取代,例如更换手机铃声:一首歌取代另一首歌(词,曲,和声 ...

  9. Python全栈工程师

    ParisGabriel       Python 入门基础   print(“hello world”)变量 : 存储信息的,日后被调用.修改操作常量: 固定不变的量,字母大写命名规则:1. 字母数 ...

  10. 孤荷凌寒自学python第五十八天成功使用python来连接上远端MongoDb数据库

    孤荷凌寒自学python第五十八天成功使用python来连接上远端MongoDb数据库 (完整学习过程屏幕记录视频地址在文末) 今天是学习mongoDB数据库的第四天.今天的感觉是,mongoDB数据 ...