Warm up HDU - 4612( 树的直径 边双连通分量)
求在图中新建一条边后 剩下的最少的桥的数量。。
先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( 树的直径 边双连通分量)的更多相关文章
- Warm up HDU - 4612 树的直径
题意:给出n个点和m条边的无向图,存在重边,问加一条边以后,剩下的桥的数量最少为多少. 题解: 你把这个无向图缩点后会得到一个只由桥来连接的图(可以说这个图中的所有边都是桥,相当于一棵树),然后我们只 ...
- 【HDU 4612 Warm up】BCC 树的直径
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4612 题意:一个包含n个节点m条边的无向连通图(无自环,可能有重边).求添加一条边后最少剩余的桥的数 ...
- (求树的直径)Warm up -- HDU -- 4612
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4612 给一个无向图, 加上一条边后,求桥至少有几个: 那我们加的那条边的两个顶点u,v:一定是u,v之 ...
- F - Warm up - hdu 4612(缩点+求树的直径)
题意:有一个无向连通图,现在问添加一条边后最少还有几个桥 分析:先把图缩点,然后重构图为一棵树,求出来树的直径即可,不过注意会有重边,构树的时候注意一下 *********************** ...
- F - Warm up HDU - 4612 tarjan缩点 + 树的直径 + 对tajan的再次理解
题目链接:https://vjudge.net/contest/67418#problem/F 题目大意:给你一个图,让你加一条边,使得原图中的桥尽可能的小.(谢谢梁学长的帮忙) 我对重边,tarja ...
- 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 ...
- hdu4612 Warm up 缩点+树的直径
题意抽象后为:给定一个无向图 问添加一条边的情况下最少能有多少个桥. 桥的定义:删除该边后原图变为多个连通块. 数据规模:点数N(2<=N<=200000),边数M(1<=M< ...
- hdu 4679 树的直径
/* 题目大意:给n个点n-1条边的树,求删除哪条边时两个树中最大的直径与边权的乘积最小. 树的直径(Diameter)是指树上的最长简单路. 直径的求法:两遍BFS (or DFS) 若删除的边不是 ...
- hdu 3721 树的直径
思路:枚举+树的直径 #include<iostream> #include<cstring> #include<cstdio> #include<algor ...
随机推荐
- ansible 常用方法
测试:用shell执行一个脚本很麻烦的,用script执行 1)推送脚本过去,并授权 ansible george -m copy -a "src=/tmp/test.sh dest=/tm ...
- day 30
今日内容: 单例模式的四种方法 网络编程的介绍 单例模式: 什么是单例模式? 单例模式就是经过多次实例化,指向的是同一实例 为何要用单例模式? 可以节省内存资源 如何用单例模式? 方式一:利用绑定方法 ...
- jqgrid 选中行触发编辑,切换下一行时验证和异步保存上一行数据
有时,我们需要批量修改或填写一些相似的数据.可以以jqgrid表来显示,可能的效果如下: 选中触发行编辑参考:jqgrid 单击行启用行编辑,切换行保存原编辑行 本文主要说说验证和异步保存上一条数据的 ...
- OO——电梯作业总结
目录 电梯作业总结 程序结构与复杂度的分析 第一次作业 第二次作业 第三次作业 程序BUG的分析 互测 自动评测 有效性 总结 电梯作业总结 程序结构与复杂度的分析 第一次作业 1.设计思路 第一次作 ...
- 20155339 Exp3 免杀原理与实践
20155339 Exp3 免杀原理与实践 基础问题 (1)杀软是如何检测出恶意代码的? 基于特征码的检测(杀软的特征库中包含了一些数据或者数据段,杀软会尽可能的更新这个特征库,以包括尽可能多的恶意代 ...
- Nginx日常报错处理总结
在Nginx错误日志中,有大量的下列信息: Upstream timed out (110: Connection timed out) while reading response header f ...
- python 算法面试题
1.题目是:有一组“+”和“-”符号,要求将“+”排到左边,“-”排到右边,写出具体的实现方法. def StringSort(data): startIndex=0 endIndex=0 count ...
- JavaScript 为什么不要使用 eval
本文内容 eval 隐藏的 eval 安全问题 结论 参考资料 eval eval 函数是一个高等级的函数,它与任何对象都无关.其参数,如果是一个字符串表达式,那么该函数计算表达式的值:如果是一个 ...
- centos7 lldb 调试netcore应用的内存泄漏和死循环示例(dump文件调试)
写个demo来玩一玩linux平台下使用lldb加载sos来调试netcore应用. 当然,在真实的产线环境中需要分析的数据和难度远远高于demo所示,所以demo的作用也仅仅只能起到介绍工具的作用. ...
- VS 远程调试 Azure Web App
如果能够远程调试部署在 Azure 上的 Web App,将会极大的提高我们修复 bug 的效率.Visual Studio 一贯以功能强大.好用著称,当然可以通吃基于 Azure 应用的创建.发布和 ...