题意:有一些联通的地方,如果2点间只有一条路径,这样的边叫做桥,现在让你添加一个桥,使最后的桥最少,问最少的桥使多少?

  先求一次强连通分量,然后图就分成了几个块,将这几个块看做点,求出总共有多少条重建图中的边,然后再求出最长的边,这样答案就是总共

边数 - 最长的边的长度。原来的标记手法过了几题,但是做这题有点问题,用了另一个手法。

#pragma comment(linker, "/STACK:102400000,102400000")
#include<map>
#include<queue>
#include<stack>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define INF 1000000001
#define ll __int64
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
using namespace std;
const int MAXN = ;
struct node
{
int to;
int next;
int vis;
}edge[ * ],a[ * ];
struct fnode
{
int x;
int val;
};
int n,m,ind,pre[MAXN],ins[MAXN],low[MAXN],dfn[MAXN],vis[MAXN],num[MAXN],fpre[MAXN];
int fp,len,p;
stack<int>s;
void Init()
{
fp = ;
ind = ;
while(!s.empty())s.pop();
memset(num,,sizeof(num));
memset(ins,,sizeof(ins));
memset(pre,-,sizeof(pre));
memset(vis,,sizeof(vis));
memset(dfn,,sizeof(dfn));
memset(low,,sizeof(low));
}
void add(int x,int y)
{
edge[ind].to = y;
edge[ind].vis = ;
edge[ind].next = pre[x];
pre[x] = ind ++;
}
void dfs(int rt,int k,int fa)
{
s.push(rt);
vis[rt] = ins[rt] = ;
low[rt] = dfn[rt] = k;
for(int i = pre[rt]; i != -; i = edge[i].next){
int t = edge[i].to;
if(edge[i].vis)continue;
edge[i].vis = edge[i^].vis = ;
//原来判断 fa != t 但是有重边的情况这种标记不行。
if(!dfn[t]){
dfs(t,k+,rt);
low[rt] = min(low[rt],low[t]);
}
else{
low[rt] = min(dfn[t],low[rt]);
}
}
if(low[rt] == dfn[rt]){
while(!s.empty()){
int temp = s.top();
s.pop();
num[temp] = fp;
if(temp == rt)break;
}
fp ++;
}
}
void add_b(int x,int y)
{
a[ind].to = y;
a[ind].next = fpre[x];
fpre[x] = ind ++;
}
void build(int rt)
{
vis[rt] = ;
for(int i = pre[rt]; i != -; i=edge[i].next){
int t = edge[i].to;
if(!vis[t]){
if(num[t] != num[rt]){
add_b(num[t],num[rt]);
add_b(num[rt],num[t]);
}
build(t);
}
}
}
void bfs(int rt)
{
queue<fnode>q;
fnode temp;
temp.val = ;
temp.x = rt;
vis[rt] = ;
q.push(temp);
while(!q.empty()){
temp = q.front();
q.pop();
for(int i = fpre[temp.x]; i != -; i = a[i].next){
int t = a[i].to;
if(!vis[t]){
fnode ft;
ft.val = temp.val + ;
ft.x = t;
vis[t] = ;
q.push(ft);
if(ft.val > len){
len = ft.val;
p = ft.x;
}
}
}
}
}
int main()
{
while(~scanf("%d%d",&n,&m)){
if(!n && !m)break;
Init();
for(int i = ; i <= m; i++){
int x,y;
scanf("%d%d",&x,&y);
add(x,y);
add(y,x);
}
for(int i = ; i <= n; i++){
if(!dfn[i]){
dfs(i,,-);
}
}
memset(vis,,sizeof(vis));
ind = ;
memset(fpre,-,sizeof(fpre));
for(int i = ; i <= n; i++){
if(!vis[i]){
build(i);
}
}
len = ;
p = ;
memset(vis,,sizeof(vis));
bfs();
len = ;
memset(vis,,sizeof(vis));
bfs(p);
fp -= ;
int ans = fp - - len;
//cout<<"fp = "<<fp<<" len = "<<len<<endl;
cout<<(ans > ? ans : )<<endl;
}
return ;
}

hdu 4612 强连通的更多相关文章

  1. HDU 4612——Warm up——————【边双连通分量、树的直径】

    Warm up Time Limit:5000MS     Memory Limit:65535KB     64bit IO Format:%I64d & %I64u Submit Stat ...

  2. Hdu 4612 Warm up (双连通分支+树的直径)

    题目链接: Hdu 4612 Warm up 题目描述: 给一个无向连通图,问加上一条边后,桥的数目最少会有几个? 解题思路: 题目描述很清楚,题目也很裸,就是一眼看穿怎么做的,先求出来双连通分量,然 ...

  3. Hdu 1269 强连通判定

    题目链接 迷宫城堡 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total S ...

  4. HDU 3072 (强连通分量)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3072 题目大意:为一个有向连通图加边.使得整个图全连通,有重边出现. 解题思路: 先用Tarjan把 ...

  5. hdu 4612 Warm up

    http://acm.hdu.edu.cn/showproblem.php?pid=4612 将原图进行缩点 变成一个树 树上每条边都是一个桥 然后加一条边要加在树的直径两端才最优 代码: #incl ...

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

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

  7. hdu 4685(强连通分量+二分图)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4685 题意:n个王子和m个公主,王子只能和他喜欢的公主结婚,公主可以和所有的王子结婚,输出所有王子可能 ...

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

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

  9. HDU 4612 Warm up tarjan 树的直径

    Warm up 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=4612 Description N planets are connected by ...

随机推荐

  1. AC日记——验证字串 openjudge 1.7 18

    18:验证子串 总时间限制:  1000ms 内存限制:   65536kB 描述 输入两个字符串,验证其中一个串是否为另一个串的子串. 输入 输入两个字符串, 每个字符串占一行,长度不超过200且不 ...

  2. MySQL 5.7.x 配置教程

    软件环境 操作系统:windows 10 x64 企业版 MySQL:mysql-5.7.11-winx64 MySQL官网下载:http://downloads.mysql.com/archives ...

  3. Linux设备驱动之中断支持及中断分层

    快速中断:在开启快速中断时,其他中断不会打断快速中断. 多个中断共享一个中断号. 中断行为受到限制: 1.不能使用可能引起阻塞的函数 2.不能使用可能引起调度的函数 中断注册:request_irq( ...

  4. 关于maya动力学系统的一些总结

    maya动力学有以下几套系统: 1.刚体.柔体系统 刚体系统的典型节点连接方法如下: 物体的变换节点.形状节点连接rigidBody节点,刚体节点输出力到解算器节点,解算器输出新的变换到变换节点 值得 ...

  5. HTML 学习笔记 CSS样式(背景)

    背景色 可以使用background-color属性为元素设置背景色 这个属性接受任何合法的颜色值. 可以使用background-image属性来喂元素设置背景图片. 背景重复 如果需要在页面上对背 ...

  6. 今天看了shell大神的写的一个统计脚本

    通过nginx日志统计接口耗时排行 grep '/bigbox?' access_log | awk '{print $7"&process="$NF}'| sed -r ...

  7. Java 集合系列16之 HashSet详细介绍(源码解析)和使用示例

    概要 这一章,我们对HashSet进行学习.我们先对HashSet有个整体认识,然后再学习它的源码,最后再通过实例来学会使用HashSet.内容包括:第1部分 HashSet介绍第2部分 HashSe ...

  8. DEDECMS之六 网站地图、RSS地图

    在用织梦CMS做网站的都知道,在它的robots.txt是屏蔽掉了data目录的,可是,不巧dedecms默认的网站地图是在data下的,为了让蜘蛛更好的爬行,有必要将dedecms生成的网站地图放在 ...

  9. Linux shell特性

    一:别名 .alias 查看本用户下的alias配置 --自定义别名:alias 别名='shell命令' (注意是单引号) --cat $HOME/.bashrc 在这个用户下配置着alias名的配 ...

  10. web学习第一章

    web学习第一章   我是大概9月10日开始走上IT之路的,一开始学习了小段时间的自动化办公软件, 昨天我开始学习客户端网页编程,我了解什么是WEB,一些比较老古董的计算模式和发展历史,印象最让我深刻 ...