hdu4612:http://acm.hdu.edu.cn/showproblem.php?pid=4612

题意:给你一个无向连通图,问加上一条边后得到的图的最少的割边数;

题解:首先对原图求割边数,然后缩点之后建树,然后求树的直径。因为加上一条边,能消耗最大的割边就是树的直径。一道很好的模板题目。

  1. #pragma comment(linker,"/STACK:100000000,100000000")//阔栈的语句
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <vector>
  5. #define pb push_back
  6. using namespace std;
  7. const int maxn = ;
  8. const int maxm = ;
  9. struct EDGE{
  10. int next, to, vis;
  11. }edge[maxm*];//记录边,vis表示这一条边是否被访问
  12. struct GEEDGE {
  13. int u, to;
  14. }geedge[maxm];//记录割边
  15. int n,m,time,top,type,getot,cnt;//time是时间戳,type标记连通块,getot割边的数量,cnt边数
  16. int head[maxn],st[maxn],dfn[maxn],low[maxn],belo[maxn];//belo[i],表示i属于哪个连通块
  17. int start,ans1,ans,u,v;
  18. void init(){
  19. time=top=type=getot=cnt=;
  20. memset(head,-,sizeof(head));
  21. memset(dfn,,sizeof(dfn));
  22. memset(low,,sizeof(low));
  23. memset(belo,,sizeof(belo));
  24. }
  25. void add(int u,int v){
  26. edge[cnt].to=v;
  27. edge[cnt].next=head[u];
  28. edge[cnt].vis=;
  29. head[u]=cnt++;
  30. }
  31. void dfs(int u) {
  32. low[u] = dfn[u] = ++time;
  33. st[++top] = u;
  34. for(int i = head[u];i != -;i = edge[i].next) {
  35. if(edge[i].vis) continue;
  36. edge[i].vis = edge[i^].vis = ;
  37. int to = edge[i].to;
  38. if(!dfn[to]) {
  39. dfs(to);
  40. low[u] = min(low[u], low[to]);
  41. if(low[to] > dfn[u]) {//表示找到一个连通块
  42. type++;
  43. int v;
  44. do {
  45. v = st[top--];
  46. belo[v] = type;//表示v属于第type个连通块
  47. } while(v != to);
  48. geedge[++getot].u = u;//记录割边的起点
  49. geedge[getot].to = to;//记录割边的另一个点
  50. }
  51. }
  52. else
  53. low[u] = min(low[u], low[to]);
  54. }
  55. }
  56. void DFS(int len,int fa,int now){//求树的直径
  57. if(len>ans){
  58. ans=len;
  59. start=now;
  60. }
  61. for(int i=head[now];i!=-;i=edge[i].next){
  62. int v=edge[i].to;
  63. if(v!=fa) DFS(len+,now,v);
  64. }
  65. }
  66. int main(){
  67. while(~scanf("%d%d",&n,&m)&&n){
  68. init();
  69. for(int i=;i<=m;i++){
  70. scanf("%d%d",&u,&v);
  71. add(u,v);
  72. add(v,u);
  73. }
  74. for(int i=;i<=n;i++)
  75. if(!dfn[i])
  76. dfs(i);
  77. ans1=getot;
  78. memset(head,-,sizeof(head));cnt=;//刷新边,接下来从新加边
  79. for(int i=;i<=ans1;i++){
  80. add(belo[geedge[i].to],belo[geedge[i].u]);
  81. add(belo[geedge[i].u],belo[geedge[i].to]);
  82. }
  83. ans = ;
  84. DFS(,-,);//
  85. ans=;
  86. DFS(,-,start);//两遍DFS求树的直径
  87. printf("%d\n", getot-ans);
  88. }
  89. }

Warm up的更多相关文章

  1. f4: Facebook’s Warm BLOB Storage System——Erasure Code

    Facebook在OSDI 2014上发表论文f4: Facebook's Warm BLOB Storage System,这个系统主要目的就是降低存储成本,在容忍磁盘,主机,机架,数据中心的同时提 ...

  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 4612 Warm up tarjan缩环+求最长链

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

  4. HDU 4612 Warm up(2013多校2 1002 双连通分量)

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

  5. HDU 4619 Warm up 2(2013多校2 1009 二分匹配)

    Warm up 2 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total S ...

  6. hdu 4619 Warm up 2(并查集)

    借用题解上的话,就是乱搞题.. 题意理解错了,其实是坐标系画错了,人家个坐标系,我给当矩阵画,真好反了.对于题目描述和数据不符的问题,果断相信数据了(这是有前车之鉴的hdu 4612 Warm up, ...

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

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

  8. 2013多校联合2 I Warm up 2(hdu 4619)

    Warm up 2 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Total ...

  9. HDU 多校联合练习赛2 Warm up 2 二分图匹配

    Warm up 2 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Total ...

  10. 多校联赛2 Problem2 Warm up 求桥的数目+缩点后的树的直径 当时被不知道原因的爆栈爆到无语了。。

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

随机推荐

  1. oracle3

    查看表结构 DESC emp; 查询所有列 SELECT * FROM dept; 切忌动不动就用select * set timing on; 打开显示操作时间的开关,在下面显示查询时间. CREA ...

  2. careercup-数组和字符串1.7

    1.7 编写一个算法,若M*N矩阵中某个元素为0,则将其所在的行与列清零. 类似于leetcode中的 Set Matrix Zeroes C++实现代码: #include<iostream& ...

  3. Myapplication的作用与理解

    1.前沿在设置里面,对应于某一个应用,虽然没有启动,但是上面有一个终止按钮,说明这个应用时启动的,只是里面没有Activity,所以说使用android退出把一个应用退出,实际上他所对应的Applic ...

  4. j2ee学习笔记 Filter过滤器

    作用:过滤response和request对象的内容 使用: Filter是J2EE的一个接口,自定义Filter需要实现该接口,并重写所有的方法. Filter提供的方法: init() doFil ...

  5. java Thread.join()

    thread1.join()方法阻塞调用此方法的线程,直到线程thread1完成,此线程再继续. 通常用于在main()主线程内,等待其它线程完成再结束main()主线程 @Test /** * ou ...

  6. Mysql Join语法解析与性能分析详解

    一.Join语法概述 join 用于多表中字段之间的联系,语法如下: ... FROM table1 INNER|LEFT|RIGHT JOIN table2 ON conditiona table1 ...

  7. DataGridView编辑实时生效和索引-1没有值问题

    1. 问题:DataGridView单元格编辑后,只有离开焦点时,编辑的内容才会生效(在绑定的DataSource中生效).  使用 this.dataGridView1.CommitEdit(Dat ...

  8. ITPub 上的一道题,学习下思路

    有意思的,从别处看来的即可为己用--拿来主义 数据库:MS SQL 2000: drop table mytest go create table mytest (   sn      int,    ...

  9. struts -执行流程

    When a client request is given, a web container will receive request Web container loads web.xml and ...

  10. UITabBar-UITabBarItem图片的背景颜色属性和文字的颜色大小设置

    UITabBarItem设置的图片选中状态下默认的是蓝色,如何改变它的颜色为图片自带的颜色呢? typedef NS_ENUM(NSInteger, UIImageRenderingMode) { / ...