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 ...
随机推荐
- OpenGL笔记(四) API参考
常见API glActiveTexture 选择活动纹理单元 glAttachShader 将一个着色器对象绑定到一个程序对象 void glAttachShader(GLuint program, ...
- day69
昨日回顾: 1 路由层: 1简单配置 2无名分组 3有名分组 4反向解析--模板层,视图层 5路由分发 include 6名称空间 7伪静态 2 作业: urlpatterns = ...
- -bash: start-all.sh: 未找到命令
解决方案:以root权限进入,找到hadoop安装的目录,进入sbin目录下 输入命令#start-all.sh 出现错误:-bash: start-all.sh: 未找到命令 百度了一下:原来需要输 ...
- maven使用出现的错误
修改mvn archetype:create 改成mvn archetype:generate 刚开始学习用Maven, 装好了以后生成一个新的project mvnarchetype:genera ...
- 【实战】verilog中`define的使用记录
背景: 在最近实战开发中发现:对外部芯片进行初始化时,往往需要定义大量参数. 若直接在module中通过localparam或者parameter进行参数定义的话,会带来两个问题: 1.代码长度增加, ...
- MAC下配置ssh让SourceTree通过秘钥访问远程仓库
问题描述 由于TortoiseGit没有MAC版本,我们使用了SourceTree来替代. 在帮同事解决Mac下的Git的时候,碰到一个问题:SourceTree无法使用ssh方式提交代码,这是由于没 ...
- pycharm最常用的快捷键总结
工欲善其事必先利其器,Python开发利器Pycharm常用快捷键以及配置如下,相信有了这些快捷键,你的开发会事半功倍 一 常用快捷键 编辑类: Ctrl + D 复制选定的区 ...
- TDD 与 CI 在 Python 中的实践
社区化产品的长久生存之道可能莫过于对迭代周期的控制.还记得以前采用老土的阶段开发的年代,将软件生命周期分为各个阶段,当到达每个阶段的里程碑则集中所有的资源.人力作全面冲刺.每次到了里程碑的检查点冲过了 ...
- Asp.Net_from标签中的Enctype=multipart/form-data作用
ENCTYPE="multipart/form-data"用于表单里有图片上传. <form name="userInfo" method="p ...
- harbor使用和管理
一.上传本地镜像到harbor中 先在harbor 中创建testdocker 项目 因为我们本地没有镜像,我们先拉取一个镜像,然后进行下面的操作 查看nginx 镜像 2.下载nginx镜像到本地 ...