题意:有一个无向连通图,现在问添加一条边后最少还有几个桥
分析:先把图缩点,然后重构图为一棵树,求出来树的直径即可,不过注意会有重边,构树的时候注意一下
***********************************************************************
  1. #pragma comment(linker, "/STACK:102400000,102400000")
  2. #include<stdio.h>
  3. #include<string.h>
  4. #include<algorithm>
  5. #include<queue>
  6. using namespace std;
  7.  
  8. const int MAXN = 2e5+;
  9.  
  10. struct Edge{int v, vis, next;}e1[MAXN*], e2[MAXN*];
  11. int Head1[MAXN], Head2[MAXN], cnt[], fa[MAXN];
  12. void AddEdge(Edge e[], int Head[], int u, int v, int k)
  13. {
  14.     e[ cnt[k] ].= v;
  15.     e[ cnt[k] ].vis = ;
  16.     e[ cnt[k] ].next = Head[u];
  17.     Head[u] = cnt[k]++;
  18. }
  19.  
  20. struct node{int u, step;};
  21. node BFS(node s, int k)
  22. {
  23.     queue<node> Q;
  24.     Q.push(s);
  25.  
  26.     while(Q.size())
  27.     {
  28.         s = Q.front();Q.pop();
  29.  
  30.         for(int j=Head2[s.u]; j!=-; j=e2[j].next)
  31.         {
  32.             node q = s;
  33.             q.= e2[j].v;
  34.  
  35.             if(e2[j].vis != k)
  36.             {
  37.                 e2[j].vis = e2[j^].vis = k;
  38.                 q.step++;
  39.                 Q.push(q);
  40.             }
  41.         }
  42.  
  43.     }
  44.  
  45.     return s;
  46. }
  47.  
  48. int dfn[MAXN], low[MAXN], Index;
  49. int belong[MAXN], bnt;
  50. int Stack[MAXN], top;
  51.  
  52. void InIt(int N)
  53. {
  54.     cnt[] = cnt[] = Index = bnt = top = ;
  55.     for(int i=; i<=N; i++)
  56.     {
  57.         Head1[i] = Head2[i] = -;
  58.         dfn[i] = ;
  59.         fa[i] = ;
  60.     }
  61. }
  62. void Tarjan(int u)
  63. {
  64.     int v;
  65.  
  66.     low[u] = dfn[u] = ++Index;
  67.     Stack[++top] = u;
  68.  
  69.     for(int j=Head1[u]; j!=-; j=e1[j].next)
  70.     {
  71.         v = e1[j].v;
  72.         if(e1[j].vis == false)
  73.         {
  74.             e1[j].vis = e1[j^].vis = true;
  75.             if( !dfn[v] )
  76.             {
  77.                 Tarjan(v);
  78.                 low[u] = min(low[u], low[v]);
  79.             }
  80.             else
  81.                 low[u] = min(low[u], dfn[v]);
  82.         }
  83.     }
  84.  
  85.     if(low[u] == dfn[u])
  86.     {
  87.         ++bnt;
  88.         do
  89.         {
  90.             v = Stack[top--];
  91.             belong[v] = bnt;
  92.         }
  93.         while(!= v);
  94.     }
  95. }
  96. int main()
  97. {
  98.     int N, M;
  99.  
  100.     while(scanf("%d%d", &N, &M), N+M)
  101.     {
  102.         int i, j, u, v;
  103.  
  104.         InIt(N);
  105.  
  106.         while(M--)
  107.         {
  108.             scanf("%d%d", &u, &v);
  109.             AddEdge(e1, Head1, u, v, );
  110.             AddEdge(e1, Head1, v, u, );
  111.         }
  112.  
  113.         Tarjan();
  114.  
  115.         for(i=; i<=N; i++)
  116.         for(j=Head1[i]; j!=-; j=e1[j].next)
  117.         {
  118.             v = e1[j].v;
  119.             u = belong[i], v = belong[v];
  120.             if(> v && fa[v] != u)
  121.             {
  122.                 fa[v] = u;
  123.                 AddEdge(e2, Head2, u, v, );
  124.                 AddEdge(e2, Head2, v, u, );
  125.             }
  126.         }
  127.  
  128.         node s;
  129.         s.= , s.step = ;
  130.  
  131.         s = BFS(s, );
  132.         s.step = ;
  133.         s = BFS(s, );
  134.  
  135.         printf("%d\n", bnt-s.step-);
  136.     }
  137.  
  138.     return ; } 

F - Warm up - hdu 4612(缩点+求树的直径)的更多相关文章

  1. hdu 4607 Park Visit 求树的直径

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4607 题目大意:给你n个点,n-1条边,将图连成一棵生成树,问你从任意点为起点,走k(k<=n) ...

  2. HDU 4607 Park visit (求树的直径)

    解题思路: 通过两次DFS求树的直径,第一次以随意点作为起点,找到距离该点距离最远的点,则能够证明这个点一定在树的直径上,然后以该点为起点进行DFS得到的最长路就是树的直径. 最后的询问,假设K &l ...

  3. F - Warm up HDU - 4612 tarjan缩点 + 树的直径 + 对tajan的再次理解

    题目链接:https://vjudge.net/contest/67418#problem/F 题目大意:给你一个图,让你加一条边,使得原图中的桥尽可能的小.(谢谢梁学长的帮忙) 我对重边,tarja ...

  4. HDU 4612 Warm up(双连通分量缩点+求树的直径)

    思路:强连通分量缩点,建立一颗新的树,然后求树的最长直径,然后加上一条边能够去掉的桥数,就是直径的长度. 树的直径长度的求法:两次bfs可以求,第一次随便找一个点u,然后进行bfs搜到的最后一个点v, ...

  5. HDU 4612 Warm up —— (缩点 + 求树的直径)

    题意:一个无向图,问建立一条新边以后桥的最小数量. 分析:缩点以后,找出新图的树的直径,将这两点连接即可. 但是题目有个note:两点之间可能有重边!而用普通的vector保存边的话,用v!=fa的话 ...

  6. hdu4612 无向图中随意加入一条边后使桥的数量最少 / 无向图缩点+求树的直径

    题意如上,含有重边(重边的话,俩个点就能够构成了边双连通). 先缩点成树,在求数的直径,最远的连起来,剩下边(桥)的自然最少.这里学习了树的直径求法:第一次选随意起点U,进行bfs,到达最远的一个点v ...

  7. hdu4612 无向图中任意添加一条边后使桥的数量最少 / 无向图缩点+求树的直径

    题意如上,含有重边(重边的话,俩个点就可以构成了边双连通). 先缩点成树,在求数的直径,最远的连起来,剩下边(桥)的自然最少.这里学习了树的直径求法:第一次选任意起点U,进行bfs,到达最远的一个点v ...

  8. (求树的直径)Warm up -- HDU -- 4612

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4612 给一个无向图, 加上一条边后,求桥至少有几个: 那我们加的那条边的两个顶点u,v:一定是u,v之 ...

  9. hdoj 4612 Warm up【双连通分量求桥&&缩点建新图求树的直径】

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

随机推荐

  1. 刚入门的easyui

    这两天看了下easyui的教学先说说自己的一些小小理解吧! ----在使用easyui中也遇到了一个问题 : Uncaught TypeError:cannot call method ‘offset ...

  2. Jquery~$when_done_then的用法

    对于$.ajax请求来说,如果层级比较多,程序看起来会比较乱,而为了解决这种问题,才有了$when...done...fail...then的封装,它将$.ajax这嵌套结构转成了顺序平行的结果,向下 ...

  3. 【转】Java 读写Properties配置文件

    [转]Java 读写Properties配置文件 1.Properties类与Properties配置文件 Properties类继承自Hashtable类并且实现了Map接口,也是使用一种键值对的形 ...

  4. Java中的继承与组合

    本文主要说明Java中继承与组合的概念,以及它们之间的联系与区别.首先文章会给出一小段代码示例,用于展示到底什么是继承.然后演示如何通过“组合”来改进这种继承的设计机制.最后总结这两者的应用场景,即到 ...

  5. jQuery放大镜插件jqzoom使用

    源码下载,使用指导地址:http://www.mind-projects.it/projects/jqzoom/ 使用教程: 1.导入库文件 <script src="../js/jq ...

  6. php中文件引入require

    ./ 表示当前层 ../表示向上一层 php中好像不能像asp那样,用 “/” 表示根目录,但可以用$_SERVER['DOCUMENT_ROOT'] 表示网站根目录 引用分为三种: 上级对下级的引用 ...

  7. js 联系电话验证实现

         var str=$('#tele').val();                                       var regPartton=/1[3-8]+\d{9}/;  ...

  8. Django models通过DateTimeField保存到MySQL的时间的时区问题

    最近开始使用Django开发一些系统,在models.py中设置一些数据库表结构并给日期时间字段赋初值,不过在使用的过程中,遇到一点问题.问题是,我本来服务器使用的市区是“Asia/Shanghai” ...

  9. 在win8.1 64位环境下有关Oracle的安装和卸载

    1,Oracle安装 3 注意:在win8.1环境下安装64位的oracle客户端,注意配置是1g的 2.Oracle的卸载:http://jingyan.baidu.com/article/f7ff ...

  10. TCP回射客户程序:str_cli函数

    str_cli函数完成客户处理循环: 从标准输入读入一行文本,写到服务器上,读回服务器对该行的回射,并把回射行写到标准输出上 读入一行,写到服务器 fgets读入一行文本,writen把该行发送给服务 ...