【HDU4612】 双连通分量求桥
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4612
题目大意:给你一个无向图,问你加一条边后最少还剩下多少多少割边。
解题思路:好水的一道模板题。先缩点变成一颗树,再求树的最长直径,直径两端连一条边就是最优解了。
但是....我WA了一个下午.....没有处理重边。
重边的正确处理方法:只标记已经走过的正反边,而不限制已走过的点。换句话说就是可以经过重边再次走向父亲节点,而不能经过走过边的反向边返回父亲节点。
#pragma comment(linker, "/STACK:1024000000,1024000000")
#include <iostream>
#include <cstdio>
#include <queue>
#include <algorithm>
#include <cstring>
using namespace std; const int maxn=;
const int maxm=;
int dfn[maxn], low[maxn], head[maxn], stack[maxn], instack[maxn], belong[maxn];
int reach[maxm], next[maxm], sign[maxm];
int visit[maxn];
int top, Index, scnt, edge, pos, bridgenum;
int n, m;
pair<int,int>num[maxm]; struct node
{
int u;
int dis;
int fa;
};
queue<node>q; void init()
{
memset(head,-,sizeof(head));
memset(dfn,,sizeof(dfn));
memset(instack,,sizeof(instack));
Index=top=edge=scnt=bridgenum=;
} void addedge(int u, int v)
{
sign[edge]=, reach[edge]=v, next[edge]=head[u], head[u]=edge++;
sign[edge]=, reach[edge]=u, next[edge]=head[v], head[v]=edge++;
} void tarjan(int u)
{
stack[++top]=u;
dfn[u]=low[u]=++Index;
instack[u]=;
for(int i=head[u]; i>=; i=next[i])
{
if(sign[i]) continue;
sign[i]=, sign[i^]=; ///处理重边,只标记边,而不限制点
int v=reach[i];
if(!dfn[v])
{
tarjan(v), low[u]=min(low[u],low[v]);
if(dfn[u]<low[v]) bridgenum++; ///求桥的数量
}
else if(instack[v]) low[u]=min(low[u],dfn[v]);
}
if(low[u]==dfn[u])
{
int v;
scnt++; ///双连通分量的数量
do
{
v=stack[top--];
instack[v]=;
belong[v]=scnt;
}
while(u!=v);
}
} int bfs(int st)
{
int maxx=;
while(!q.empty()) q.pop();
memset(visit,,sizeof(visit));
node s, p;
s.u=st, s.dis=, s.fa=-;
q.push(s);
visit[s.u]=;
while(!q.empty())
{
p=q.front();
q.pop();
for(int i=head[p.u]; i>=; i=next[i])
{
int v=reach[i];
if(v==p.fa) continue;
s.u=v, s.dis=p.dis+, s.fa=p.u;
if(!visit[s.u])
{
visit[s.u]=, q.push(s);
if(s.dis>maxx)
{
maxx=s.dis;
pos=s.u;
}
}
}
}
return maxx;
} void Solve()
{
memset(head,-,sizeof(head));
edge=;
for(int i=; i<=m; i++)
{
int u=num[i].first, v=num[i].second;
int x=belong[u], y=belong[v];
if(x!=y) addedge(x,y);
}
bfs();
int ans=bfs(pos);
cout << bridgenum-ans <<endl;
} int main()
{
while(cin >> n >> m, n+m)
{
init();
for(int i=; i<=m; i++)
{
int u, v;
scanf("%d%d",&u,&v);
num[i].first=u, num[i].second=v;
addedge(u,v);
}
for(int i=; i<=n; i++)
if(!dfn[i]) tarjan(i);
Solve();
}
return ;
} /*
10 11
1 2
2 3
3 4
2 4
3 6
5 10
5 7
7 8
8 9
7 9
3 5
*/
【HDU4612】 双连通分量求桥的更多相关文章
- hdoj 4612 Warm up【双连通分量求桥&&缩点建新图求树的直径】
Warm up Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others)Total Su ...
- zoj 2588 Burning Bridges【双连通分量求桥输出桥的编号】
Burning Bridges Time Limit: 5 Seconds Memory Limit: 32768 KB Ferry Kingdom is a nice little cou ...
- hdoj 4738 Caocao's Bridges【双连通分量求桥】
Caocao's Bridges Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- hdoj 3849 By Recognizing These Guys, We Find Social Networks Useful【双连通分量求桥&&输出桥&&字符串处理】
By Recognizing These Guys, We Find Social Networks Useful Time Limit: 2000/1000 MS (Java/Others) ...
- hdu 3849 (双联通求桥)
一道简单的双联通求桥的题目,,数据时字符串,,map用的不熟练啊,,,,,,,,,,,,, #include <iostream> #include <cstring> #in ...
- hdu 4738 (双联通求桥)
2013 ACM/ICPC Asia Regional Hangzhou Online 题目大意:有n个岛,曹操在一些岛之间建了一些桥,每个桥上有一些士兵把守,周瑜只有一个炸弹只能炸掉一个桥,炸弹需要 ...
- POJ 3352 Road Construction(边双连通分量,桥,tarjan)
题解转自http://blog.csdn.net/lyy289065406/article/details/6762370 文中部分思路或定义模糊,重写的红色部分为修改过的. 大致题意: 某个企业 ...
- fzu2181(点的双连通分量+求奇环)
求出每个点双连通分量,如果在一个点双连通分量中有奇环,则这个分量每个点都在一个奇环中. 关键是要知道怎么求点双连通分量以及点双连通的性质. fzu2181 http://acm.fzu.edu.cn ...
- 2013杭州网赛 1001 hdu 4738 Caocao's Bridges(双连通分量割边/桥)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4738 题意:有n座岛和m条桥,每条桥上有w个兵守着,现在要派不少于守桥的士兵数的人去炸桥,只能炸一条桥 ...
随机推荐
- zookeeper源码分析(一) 工作原理
来自:http://www.codedump.info/?p=207 阅读zookeeper代码一段时间(注:是很长一段时间,断断续续得有半年了吧?)之后,我要开始将一些积累下来的东西写下来了,鉴于我 ...
- 在Activity中响应ListView内部按钮的点击事件
最近交流群里面有人问到一个问题:如何在Activity中响应ListView内部按钮的点击事件,不要在Adapter中响应? 对于这个问题,我最初给他的解答是,在Adapter中定义一个回调接口,在A ...
- 记一次小团队Git实践(中)
对于初学者,从使用上先入手,往往学的最快,并从中汲取教训,再回头更深入的学习,效果尤佳. 安装git 安装git自不必说,mac已经内置了git,linux下一个命令就能搞定,windows下需要下载 ...
- 浩瀚技术助力批发零售商户实现PDA移动POS打印扫描进销存信息化管理
批发零售商户其各门店销售品种多,销售量大,在市场上占据巨大的份额,随着各门店的不断扩展,基层的销售管理并不尽如意,传统的进销存管理软件安装在PC端,无法满足有现有的业务支撑,面对当前现状,移动进销存管 ...
- [技术学习]js接口继承
js是面向对象语言,但是js又缺乏了面向对象的诸多特性,比如继承,没有接口继承也没有父类继承,因此有时候需要人工来实现继承. 一.首先看下java中面向对象的继承: //定义类鸟类的飞行动作 inte ...
- Color the ball(线段树)
Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission( ...
- HTML与HTML5笔记
doctype作用 1.告诉浏览器使用什么样的html或者xhtml规范来解析html文档 2.影响浏览器的渲染模式. 浏览器解析css的两种渲染模式:标准模式strict mode和怪异模式quir ...
- BZOJ4386 : [POI2015]Wycieczki
将每个点拆成三个点,并将转移转化为矩阵乘法,然后倍增即可求出第$k$短路的长度,注意对爆long long情况的处理. 时间复杂度$O(n^3\log k)$. #include<cstdio& ...
- java 程序访问hdfs错误 hadoop2.2.0
很奇怪的问题,程序在eclipse上跑没问题: 这就代码:FileSystem fs = FileSystem.get(URI.create(hdfs_file), conf , "use ...
- 多表头固定demo--html Table
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...