求在图中新建一条边后  剩下的最少的桥的数量。。
先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. ansible 常用方法

    测试:用shell执行一个脚本很麻烦的,用script执行 1)推送脚本过去,并授权 ansible george -m copy -a "src=/tmp/test.sh dest=/tm ...

  2. day 30

    今日内容: 单例模式的四种方法 网络编程的介绍 单例模式: 什么是单例模式? 单例模式就是经过多次实例化,指向的是同一实例 为何要用单例模式? 可以节省内存资源 如何用单例模式? 方式一:利用绑定方法 ...

  3. jqgrid 选中行触发编辑,切换下一行时验证和异步保存上一行数据

    有时,我们需要批量修改或填写一些相似的数据.可以以jqgrid表来显示,可能的效果如下: 选中触发行编辑参考:jqgrid 单击行启用行编辑,切换行保存原编辑行 本文主要说说验证和异步保存上一条数据的 ...

  4. OO——电梯作业总结

    目录 电梯作业总结 程序结构与复杂度的分析 第一次作业 第二次作业 第三次作业 程序BUG的分析 互测 自动评测 有效性 总结 电梯作业总结 程序结构与复杂度的分析 第一次作业 1.设计思路 第一次作 ...

  5. 20155339 Exp3 免杀原理与实践

    20155339 Exp3 免杀原理与实践 基础问题 (1)杀软是如何检测出恶意代码的? 基于特征码的检测(杀软的特征库中包含了一些数据或者数据段,杀软会尽可能的更新这个特征库,以包括尽可能多的恶意代 ...

  6. Nginx日常报错处理总结

    在Nginx错误日志中,有大量的下列信息: Upstream timed out (110: Connection timed out) while reading response header f ...

  7. python 算法面试题

    1.题目是:有一组“+”和“-”符号,要求将“+”排到左边,“-”排到右边,写出具体的实现方法. def StringSort(data): startIndex=0 endIndex=0 count ...

  8. JavaScript 为什么不要使用 eval

    本文内容 eval 隐藏的 eval 安全问题 结论 参考资料   eval eval 函数是一个高等级的函数,它与任何对象都无关.其参数,如果是一个字符串表达式,那么该函数计算表达式的值:如果是一个 ...

  9. centos7 lldb 调试netcore应用的内存泄漏和死循环示例(dump文件调试)

    写个demo来玩一玩linux平台下使用lldb加载sos来调试netcore应用. 当然,在真实的产线环境中需要分析的数据和难度远远高于demo所示,所以demo的作用也仅仅只能起到介绍工具的作用. ...

  10. VS 远程调试 Azure Web App

    如果能够远程调试部署在 Azure 上的 Web App,将会极大的提高我们修复 bug 的效率.Visual Studio 一贯以功能强大.好用著称,当然可以通吃基于 Azure 应用的创建.发布和 ...