求在图中新建一条边后  剩下的最少的桥的数量。。
先tarjan求桥的数量。。然后缩点。。以连通分量为点建图  bfs求直径

最后用桥的数量减去直径即为答案

bfs求直径

https://www.cnblogs.com/WTSRUVF/p/9307517.html

#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <algorithm>
#include <vector>
#include <stack>
#define mem(a, b) memset(a, b, sizeof(a))
using namespace std;
const int maxn = , INF = 0x7fffffff;
int pre[maxn], low[maxn], sccno[maxn], d[maxn], head[maxn], vis[maxn*];
int dfs_clock, n, m, scc_cnt, bridge, maxway, pos;
stack<int> S;
int cnt1, cnt2;
struct edge
{
int u, v, next;
}Edge1[maxn*],Edge2[maxn*]; void add1(int u, int v)
{
Edge1[cnt1].u = u;
Edge1[cnt1].v = v;
Edge1[cnt1].next = head[u];
head[u] = cnt1++; }
void add2(int u, int v)
{
Edge2[cnt2].u = u;
Edge2[cnt2].v = v;
Edge2[cnt2].next = head[u];
head[u] = cnt2++;
} void init()
{
dfs_clock = ;
scc_cnt = ;
cnt1 = cnt2 = ;
bridge = ;
mem(pre, );
mem(vis, );
mem(low, );
mem(head, -);
mem(sccno, );
} void tarjan(int u)
{
pre[u] = low[u] = ++dfs_clock;
S.push(u);
for(int i=head[u]; i != -; i=Edge1[i].next)
{
int v = Edge1[i].v;
if(vis[i]) continue;
vis[i] = vis[i^] = ; // 标记同向边和反向边
if(!pre[v])
{
tarjan(v);
low[u] = min(low[v], low[u]);
}
else if(!sccno[v])
low[u] = min(low[u], pre[v]);
}
if(low[u] == pre[u])
{
scc_cnt++;
for(;;)
{
int x = S.top(); S.pop();
sccno[x] = scc_cnt;
if(x == u) break;
}
}
} void bfs(int u)
{
queue<int> Q;
mem(d, );
mem(vis, );
Q.push(u);
d[u] = ;
vis[u] = ;
maxway = , pos = u;
while(!Q.empty())
{
u = Q.front(); Q.pop();
for(int i=head[u]; i != -; i=Edge2[i].next)
{
int v = Edge2[i].v;
if(vis[v]) continue;
vis[v] = ;
d[v] = d[u] + ;
if(d[v] > maxway)
maxway = d[v], pos = v;
Q.push(v);
}
}
} int main()
{
while(~scanf("%d%d",&n, &m) && n+m)
{
init();
for(int i=; i<m; i++)
{
int u, v;
scanf("%d%d",&u, &v);
add1(u, v);
add1(v, u);
}
tarjan();
mem(head, -);
for(int i=;i < cnt1; i+=) //以连通分量建图 顺便求桥的数量
if(sccno[Edge1[i].u] != sccno[Edge1[i].v])
{
add2(sccno[Edge1[i].u], sccno[Edge1[i].v]);
add2(sccno[Edge1[i].v], sccno[Edge1[i].u]);
bridge++;
} bfs(sccno[]);
bfs(pos); printf("%d\n",bridge - maxway); } return ;
}

Warm up HDU - 4612( 树的直径 边双连通分量)的更多相关文章

  1. Warm up HDU - 4612 树的直径

    题意:给出n个点和m条边的无向图,存在重边,问加一条边以后,剩下的桥的数量最少为多少. 题解: 你把这个无向图缩点后会得到一个只由桥来连接的图(可以说这个图中的所有边都是桥,相当于一棵树),然后我们只 ...

  2. 【HDU 4612 Warm up】BCC 树的直径

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4612 题意:一个包含n个节点m条边的无向连通图(无自环,可能有重边).求添加一条边后最少剩余的桥的数 ...

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

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

  4. F - Warm up - hdu 4612(缩点+求树的直径)

    题意:有一个无向连通图,现在问添加一条边后最少还有几个桥 分析:先把图缩点,然后重构图为一棵树,求出来树的直径即可,不过注意会有重边,构树的时候注意一下 *********************** ...

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

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

  6. 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 ...

  7. hdu4612 Warm up 缩点+树的直径

    题意抽象后为:给定一个无向图 问添加一条边的情况下最少能有多少个桥. 桥的定义:删除该边后原图变为多个连通块. 数据规模:点数N(2<=N<=200000),边数M(1<=M< ...

  8. hdu 4679 树的直径

    /* 题目大意:给n个点n-1条边的树,求删除哪条边时两个树中最大的直径与边权的乘积最小. 树的直径(Diameter)是指树上的最长简单路. 直径的求法:两遍BFS (or DFS) 若删除的边不是 ...

  9. hdu 3721 树的直径

    思路:枚举+树的直径 #include<iostream> #include<cstring> #include<cstdio> #include<algor ...

随机推荐

  1. 1-关于单片机通信数据传输(中断发送,大小端,IEEE754浮点型格式,共用体,空闲中断,环形队列)

    补充: 程序优化 为避免普通发送和中断发送造成冲突(造成死机,复位重启),printf修改为中断发送 写这篇文章的目的呢,如题目所言,我承认自己是一个程序猿.....应该说很多很多学单片机的对于... ...

  2. linux中分区、格式化文件系统、挂载

    以前学linux的时候,毕竟自己没搞运维,就只注重了很多命令的运用,没太在意文件系统这块.买了本linux的书,这部分看了点东西,记个笔记哈哈. 有个场景,比如说我们现在的服务器上存储不够用了,那么当 ...

  3. 第39章 ETH—Lwip以太网通信

    第39章     ETH—Lwip以太网通信 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/ ...

  4. python 3.x 用户登录重设密码

    import os import sys import getpass login_username = 'admin' login_password = ' u = 0 while u < 3 ...

  5. 约束布局constraint-layout导入失败的解决方案 - 转

    今天有同事用到了约束布局,但是导入我的工程出现错误 **提示错误: Could not find com.Android.support.constraint:constraint-layout:1. ...

  6. Java基础—异常

    一.概念 异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的. 异常体 Throwable:所有异常类的超类  Error:它表示不希望被程序捕获或者是程序无法处理的错误 ...

  7. 2017-2018-2 20155315《网络对抗技术》Exp6 :信息搜集与漏洞扫描

    实验目的 进行信息搜集的工作,为实战做准备 教程 实验内容 外围信息搜集 NMAP OpenVAS 实验步骤 (一)各种搜索技巧的应用 实战的前提是进行信息搜索.当我们想要有针对地进行操作的时候,就要 ...

  8. Exp3

    利用不同免杀方式生成文件 1.msfvenom 使用msfvenom命令查看功能介绍 其中有: -p 选择一个载荷(或者叫模块) -l 载荷列表 -f 生成的文件格式 -e 编码方式 -l 编码次数 ...

  9. python 穷举法 算24点(史上最简短代码)

    本来想用回溯法实现 算24点.题目都拟好了,就是<python 回溯法 子集树模板 系列 -- 7.24点>.无奈想了一天,没有头绪.只好改用暴力穷举法. 思路说明 根据四个数,三个运算符 ...

  10. 编译安装php时遇到virtual memory exhausted: Cannot allocate memory

    有时候用vps建站时需要通过编译的方式来安装主机控制面板.对于大内存的VPS来说一般问题不大,但是对于小内存,比如512MB内存的godaddy VPS来说,很有可能会出现问题,因为编译过程是一个内存 ...