本来就是自己负责图论,结果水了= =

题目其实很裸,就是求桥的数量,只是要新加上一条边罢了。做法:先缩点、再在树上搜最长链(第一场多校的hdu 4607Park Visit就考了最长链,小样,套个马甲以为就认不出你了),加边后求桥数就可以了。

犯了一大三小四个错误-_-

竟然真的去套模板求桥数了。。竟然没注意到树边都是桥,用树边减链边就可以了。

然后,重新建图的Build()把n传进去了。

再然后,发现读数据从0~m-1,Build()里竟然是1~m。

再再然后,原来存边的su[],sv[]数组开成了 MAXN。

  1. #pragma comment(linker, "/STACK:10240000000000,10240000000000")
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<cstdlib>
  5. #include<algorithm>
  6. using namespace std;
  7.  
  8. const int MAXM=;
  9. const int MAXN=;
  10.  
  11. struct Edge{
  12. int u,v,next;
  13. int vis;
  14. Edge(){}
  15. Edge(int _u,int _v,int _next):u(_u),v(_v),next(_next),vis(){}
  16. }edge[MAXM<<];
  17.  
  18. int brige[MAXM<<];
  19.  
  20. struct Q{
  21. int p,c;
  22. }q[MAXN];
  23.  
  24. int head[MAXN],tol;
  25. int stk[MAXN],top;
  26. int low[MAXN],dfn[MAXN],TT;
  27. int belong[MAXN],scc;
  28.  
  29. int vis[MAXN];
  30.  
  31. int su[MAXM],sv[MAXM];
  32.  
  33. int son;
  34.  
  35. void init()
  36. {
  37. tol=;
  38. memset(head,-,sizeof(head));
  39. }
  40.  
  41. void add(int u,int v)
  42. {
  43. edge[tol]=Edge(u,v,head[u]);
  44. head[u]=tol++;
  45. }
  46.  
  47. void tarjan(int u)
  48. {
  49. int v;
  50. stk[++top]=u;
  51. low[u]=dfn[u]=++TT;
  52. for(int i=head[u];i!=-;i=edge[i].next)
  53. {
  54. if(edge[i].vis)
  55. continue;
  56. edge[i].vis=edge[i^].vis=;
  57.  
  58. v=edge[i].v;
  59. if(!dfn[v]){
  60. tarjan(v);
  61. low[u]=min(low[u],low[v]);
  62. }else {
  63. low[u]=min(low[u],dfn[v]);
  64. }
  65. }
  66. if(dfn[u]==low[u]){
  67. scc++;
  68. do{
  69. v=stk[top--];
  70. //ins[v]=0;
  71. belong[v]=scc;
  72. }while(v!=u);
  73. }
  74. }
  75.  
  76. void Build(int m)
  77. {
  78. init();
  79. for(int i=;i<m;i++)
  80. {
  81. int u=su[i],v=sv[i];
  82. if(belong[u]!=belong[v]){
  83. add(belong[u],belong[v]);
  84. add(belong[v],belong[u]);
  85. }
  86. }
  87. }
  88.  
  89. int bfs(int x)
  90. {
  91. int l,r,u;
  92.  
  93. l=r=;
  94. q[r].p=x;
  95. q[r++].c=;
  96. memset(vis,,sizeof(vis));
  97. vis[x]++;
  98. while(l<r)
  99. {
  100. u=q[l].p;
  101. int c=q[l++].c;
  102. for(int i=head[u];i!=-;i=edge[i].next)
  103. {
  104. int v=edge[i].v;
  105. if(!vis[v]){
  106. q[r].p=v;
  107. q[r++].c=c+;
  108. vis[v]=;
  109. }
  110. }
  111. }
  112. return u;
  113. }
  114.  
  115. int main()
  116. {
  117. int n,m;
  118. while(~scanf("%d%d",&n,&m))
  119. {
  120. if(!n&&!m)
  121. return ;
  122. init();
  123. for(int i=;i<m;i++)
  124. {
  125. scanf("%d%d",&su[i],&sv[i]);
  126. add(su[i],sv[i]);
  127. add(sv[i],su[i]);
  128. }
  129. scc=;top=;TT=;
  130. memset(dfn,,sizeof(dfn));
  131. for(int i=;i<=n;i++)
  132. if(!dfn[i])
  133. tarjan(i);
  134.  
  135. Build(m);
  136.  
  137. int u=bfs();
  138. int v=bfs(u);
  139. printf("%d\n",scc-q[scc-].c);
  140. }
  141. return ;
  142. }
  143. /*
  144. 8 9
  145. 1 2
  146. 2 3
  147. 3 4
  148. 4 1
  149. 5 6
  150. 6 7
  151. 7 8
  152. 8 5
  153. 4 5
  154.  
  155. 8 8
  156. 1 2
  157. 2 3
  158. 3 4
  159. 5 6
  160. 6 7
  161. 7 8
  162. 8 5
  163. 4 5
  164.  
  165. 8 8
  166. 1 2
  167. 2 3
  168. 3 4
  169. 2 5
  170. 5 6
  171. 6 7
  172. 7 8
  173. 8 6
  174.  
  175. 8 9
  176. 1 2
  177. 2 3
  178. 3 4
  179. 2 5
  180. 5 6
  181. 6 7
  182. 7 8
  183. 8 6
  184. 4 5
  185.  
  186. 7 8
  187. 1 2
  188. 2 3
  189. 3 4
  190. 4 5
  191. 5 6
  192. 6 1
  193. 3 7
  194. 7 4
  195. */

hdu 4612 Warm up(缩点+树上最长链)的更多相关文章

  1. Hdu 4612 Warm up (双连通分支+树的直径)

    题目链接: Hdu 4612 Warm up 题目描述: 给一个无向连通图,问加上一条边后,桥的数目最少会有几个? 解题思路: 题目描述很清楚,题目也很裸,就是一眼看穿怎么做的,先求出来双连通分量,然 ...

  2. hdu 4612 Warm up 双连通+树形dp思想

    Warm up Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others) Total S ...

  3. hdu 4607 Park Visit(树上最长链)

    求树上最长链:两遍搜索. 第一次从树上任意点开始,最远点必然是某一条最长链上的端点u. 第二次从u开始,最远点即该最长链的另一端点. 先在最长链上走,不足再去走支链. 把询问数m错打成n,狠狠wa了一 ...

  4. [HDU4607]Park Visit(树上最长链)

    HDU#4607. Park Visit 题目描述 Claire and her little friend, ykwd, are travelling in Shevchenko's Park! T ...

  5. HDU 4612 Warm up tarjan缩环+求最长链

    Warm up Problem Description   N planets are connected by M bidirectional channels that allow instant ...

  6. hdu 4612 Warm up 双连通缩点+树的直径

    首先双连通缩点建立新图(顺带求原图的总的桥数,事实上因为原图是一个强连通图,所以桥就等于缩点后的边) 此时得到的图类似树结构,对于新图求一次直径,也就是最长链. 我们新建的边就一定是连接这条最长链的首 ...

  7. HDU4612 Warm up —— 边双联通分量 + 重边 + 缩点 + 树上最长路

    题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=4612 Warm up Time Limit: 10000/5000 MS (Java/Ot ...

  8. HDU 4612——Warm up——————【边双连通分量、树的直径】

    Warm up Time Limit:5000MS     Memory Limit:65535KB     64bit IO Format:%I64d & %I64u Submit Stat ...

  9. HDU 4612 Warm up (边双连通分量+DP最长链)

    [题意]给定一个无向图,问在允许加一条边的情况下,最少的桥的个数 [思路]对图做一遍Tarjan找出桥,把双连通分量缩成一个点,这样原图就成了一棵树,树的每条边都是桥.然后在树中求最长链,这样在两端点 ...

随机推荐

  1. oracle一些函数

    NVL( string1, replace_with):判断string1是否为空,如果是空就用replace_with代替. NVL2(E1, E2, E3)的功能为:如果E1为NULL,则函数返回 ...

  2. JQuery绑定和注销事件

    $('#action_list > li').each(function(){ $(this).unbind('click') .bind('click', function(){ /** so ...

  3. SQL语句备忘

    SELECT beatid,COUNT(d.id) dongnicount FROM `bed_beat_dongni` d INNER JOIN bed_beat b on b.id = d.bea ...

  4. 1> Strut2 Mapping to MVC

    CONTROLLER—FILTERDISPATCHER We’ll start with the controller. It seems to make more sense to start th ...

  5. VS2010 MFC DataGrid绑定实例

    VS2010环境下MFC使用DataGrid绑定数据源 参考:http://blog.csdn.net/fddqfddq/article/details/7874706 详细介绍如何在MFC中使用Da ...

  6. sublime text3 配置插件包记录

    前言: 很多插件已经开始放弃支持ST2了,所以推荐使用ST3,大量的最新插件和最新功能已经不再支持st2了. 下载地址戳这里:http://www.sublimetext.com/3 1.所有插件 易 ...

  7. lintcode 中等题:Single number III 落单的数III

    题目 落单的数 III 给出2*n + 2个的数字,除其中两个数字之外其他每个数字均出现两次,找到这两个数字. 样例 给出 [1,2,2,3,4,4,5,3],返回 1和5 挑战 O(n)时间复杂度, ...

  8. ios APP屏幕快照尺寸

    苹果上传APP审核需要上传APP屏幕快照,分别有3.5寸,4寸,4.7寸,5.5寸,ipad五种图片,对应尺寸大小: 3.5寸:横坚屏 640*960 或960*640 4寸:横坚屏 640*1036 ...

  9. LR_问题_无法使用LR的Controller,提示缺少license

    问题描述 无法使用LR的Controller,提示缺少license 问题解决 使用开始->所有程序->HP LoadRunner->loadrunner,在打开界面的左上角选择co ...

  10. Xamarin.Android 入门之:Android API版本设置

    一.引言 Xamarin.Android有几个Android API级别设置,确定多个版本的Android应用程序的兼容性.本博客解释了这些设置意味着什么,如何配置它们,以及它们在运行时对您的应用程序 ...