Financial Crisis

题意:给一个图,包含N ( 3 <= N <= 5000 )个点, M ( 0 <= M <= 10000 )条边 and Q ( 1 <= Q <= 1000 )次查询.查询:两个点是否是点-双连通;

点-双连通:两点至少存在两条"点不重复"的路径;简称双连通(biconnected);

思路:直接调用dfs求割点的算法,其实也是Tarjan发明的,就是在判断出一个割点之后,就把栈S中该双连通分量的所有点(就在栈顶)insert到同一个集合中;

注意:一个点可以属于多个双连通分类,所以bccno数组其实只是一个防止重复insert同一个点,在set中可以除去。并且注意初始化各种数组即序号(这样都TLE几次)

PS:原本使用链式向前星来存储边,可是发现在hd里竟然比直接vector建图还慢。。(一脸茫然);并且开始使用stack<PII> 直接MLE了,可是看别人直接使用库栈。。

  1. #include<iostream>
  2. #include<sstream>
  3. #include<cstdio>
  4. #include<cstring>
  5. #include<string.h>
  6. #include<algorithm>
  7. #include<map>
  8. #include<queue>
  9. #include<vector>
  10. #include<cmath>
  11. #include<stdlib.h>
  12. #include<time.h>
  13. #include<stack>
  14. #include<set>
  15. using namespace std;
  16. #define rep0(i,l,r) for(int i = (l);i < (r);i++)
  17. #define rep1(i,l,r) for(int i = (l);i <= (r);i++)
  18. #define rep_0(i,r,l) for(int i = (r);i > (l);i--)
  19. #define rep_1(i,r,l) for(int i = (r);i >= (l);i--)
  20. #define MS0(a) memset(a,0,sizeof(a))
  21. #define MS1(a) memset(a,-1,sizeof(a))
  22.  
  23. const int MAXN = ;
  24. int low[MAXN],pre[MAXN],dfs_clock,bcc_cnt;
  25. int bccno[MAXN];//看点属于哪个双连通分量;
  26. set<int> bcc[MAXN];//存储每一个双连通分量的点的标号;
  27. typedef pair<int,int> PII;
  28. #define A first
  29. #define B second
  30. #define pb push_back
  31. PII S[MAXN<<];//存储边,从中取点
  32. vector<int> e[MAXN];
  33. int top;
  34. int dfs(int u,int fa)
  35. {
  36. int lowu = pre[u] = ++dfs_clock;
  37. int child = ;
  38. rep0(i,,e[u].size()){
  39. int v = e[u][i];
  40. PII e = PII{u,v};
  41. if(!pre[v]){
  42. S[++top] = e;
  43. child++;
  44. int lowv = dfs(v,u);
  45. lowu = min(lowu,lowv);//以子节点的low来更新u的low函数;
  46. if(lowv >= pre[u]){ //表示u-v为桥
  47. bcc[++bcc_cnt].clear();
  48. for(;;){
  49. PII x = S[top--];
  50. if(bccno[x.A] != bcc_cnt){bcc[bcc_cnt].insert(x.A);bccno[x.A] = bcc_cnt;}//就是为了不重复加点
  51. if(bccno[x.B] != bcc_cnt){bcc[bcc_cnt].insert(x.B);bccno[x.B] = bcc_cnt;}
  52. if(x.A == u && x.B == v) break;//根据加入的顺序知,正好对应;
  53. }
  54. }
  55. }
  56. else if(v != fa && pre[v] < pre[u]){
  57. S[++top] = e;
  58. lowu = min(lowu,pre[v]);
  59. }
  60. }
  61. return low[u] = lowu;
  62. }
  63. int f[MAXN];
  64. int Find(int a)
  65. {
  66. return a==f[a]?f[a]:f[a]=Find(f[a]);
  67. }
  68. char ans[][] = {"zero","one","two or more"};
  69. int main()
  70. {
  71. int N,M,Q,kase = ;
  72. while(scanf("%d%d%d",&N,&M,&Q) == && N+M+Q){
  73. rep0(i,,N){
  74. f[i] = i;
  75. e[i].clear();//直接vector建图
  76. }
  77. int u,v;
  78. rep0(i,,M){
  79. scanf("%d%d",&u,&v);
  80. e[u].pb(v);e[v].pb(u);
  81. u = Find(u),v = Find(v);
  82. if(u != v) f[v] = u;
  83. }
  84. bcc_cnt = dfs_clock = top = ;
  85. MS0(pre);MS0(bccno);
  86. rep0(i,,N)if(pre[i] == )
  87. dfs(i,-);
  88. printf("Case %d:\n",kase++);
  89. rep0(i,,Q){
  90. int ret;
  91. scanf("%d%d",&u,&v);
  92. if(Find(u) != Find(v)) ret = ;
  93. else{
  94. ret = ;
  95. rep1(j,,bcc_cnt){
  96. if(bcc[j].find(u) != bcc[j].end() && bcc[j].find(v) != bcc[j].end()&&bcc[j].size() > )
  97. ret = ;
  98. }
  99. }
  100. printf("%s\n",ans[ret]);
  101. }
  102. }
  103. return ;
  104. }

HDU 3749 Financial Crisis的更多相关文章

  1. HDU 3749 Financial Crisis(点-双连通分量)

    Because of the financial crisis, a large number of enterprises go bankrupt. In addition to this, oth ...

  2. HDU 3749 Financial Crisis 经济危机(点双连通分量)

    题意: 给一个图n个点m条边(不一定连通),接下来又q个询问,询问两个点是为“不相连”,“仅有一条路径可达”,“有两条及以上的不同路径可达”三种情况中的哪一种.注:两条以上的路径指的是路径上的点连1个 ...

  3. HDU 3749 Financial Crisis (点双连通+并查集)

    <题目连接> 题目大意: 给你一个(保证输入无重边,无自环)无向图,然后有下面Q条询问,每条询问为:问你u点与v点之间有几条(除了首尾两点外,其他点不重复)的路径.如果有0条或1条输出0或 ...

  4. HDU 1064 Financial Management

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1064 解题报告:用来凑个题数吧,看题的时间比过题的时间多的多,就是输入12个浮点数,然后输出平均数,只 ...

  5. 高效算法——Most financial institutions 贪心 H

    H - 贪心 Crawling in process... Crawling failed Time Limit:3000MS     Memory Limit:0KB     64bit IO Fo ...

  6. HDU 4667 Building Fence(2013多校7 1002题 计算几何,凸包,圆和三角形)

    Building Fence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)To ...

  7. HDU 4667 Building Fence(求凸包的周长)

    A - Building Fence Time Limit:1000MS     Memory Limit:65535KB     64bit IO Format:%I64d & %I64u ...

  8. OUC_Summer Training_ DIV2_#12(DP1) 723

    这一次是做练习,主要了解了两个算法,最大子矩阵和,最长上升子序列. 先看题好啦. A - To The Max Time Limit:1000MS     Memory Limit:32768KB   ...

  9. 备战noip week8

    POJ1144 网络 description: 给出一张\(N\)个点的无向图,求其中割点的个数 data range: \(N\le 100\) solution: 一道模板题(但是读入实在是把我恶 ...

随机推荐

  1. (原)nginx 源码编译

    要在nginx上开发,所以先了解下这个是干嘛的..百度一下很多 编译源码需要的组件 1.zlib 2.pcre 3.openssl 使用ubuntu的话.可以直接使用 sudo apt-get ins ...

  2. c++20道面试题

    摘自传智播客论坛 问1:请用简单的语言告诉我C++ 是什么?答:C++是在C语言的基础上开发的一种面向对象编程语言,应用广泛.C++支持多种编程范式 --面向对象编程.泛型编程和过程化编程. 其编程领 ...

  3. Intent实现页面跳转

    Intent实现页面跳转: 1. startActivity(intent) 2. startActivityForResult(intent,requestCode); onActivityResu ...

  4. About gpref O(n2) --> O(1)

    http://www.ibm.com/developerworks/cn/linux/l-gperf.html 命令行处理和 gperf 的作用 命令行处理一直以来都是软件开发中最容易被忽视的领域.几 ...

  5. C语言结构体的引入

    #include <stdio.h> struct student{ int ID; ]; int age; }; int main(){ //赋值: , }; ,.name=}; , , ...

  6. Flume连接Kafka的broker出错

    在启动Flume的时候,出现下面的异常,但是程序照样能运行,Kafka也能够收到数据,只是偶尔会断点. 2016-08-25 15:32:54,561 (SinkRunner-PollingRunne ...

  7. 关于XML的DTD概述

    1 DTD概述 1.1 什么是DTD DTD(Document Type Definition),文档类型定义,用来约束XML文档.或者可以把DTD理解为创建XML文档的结构!例如可以用DTD要求XM ...

  8. java集合总结

    java中集合是很重要的一点,巩固这边学习的知识,把知识理一下 按马士兵的视频,总结的也很好,集合就是一个“1136” 1个图,1个类Collections,3个知识点:增强for循环,泛型,打包和解 ...

  9. JDK Tools - xjc: 将 XML Schema 编译成 Java 类

    xjc 是 JAXB 将 xsd 生成 Java 类的工具. 命令格式 xjc [ options ] schema file/URL/dir/jar ... [-b bindinfo ] ... 命 ...

  10. Windows8.1下PHP环境配置(PHP5.6、Apache2.4、MySql5.6)

    Step0 安装准备(均为64-bit版本) 下载php "Non Thread Safe"是IIS专用的,"Thread Safe"是Apache服务器用的. ...