题目大意:给出一个连通图,求再一个边后,剩余的最少桥数。

题目思路:首先进行缩点得到重构后的图,求出重构后树的直径(通过两次BFS求出相距最远的两点间的距离),ans=重构图边数-树的直径

//#pragma comment(linker, "/STACK:102400000,102400000")
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#include<vector>
#include<iostream>
#include<queue>
#include<algorithm>
#define MAXSIZE 200005
#define LL long long using namespace std; vector<vector<int> >G;
vector<vector<int> >G2;
int vis[MAXSIZE],low[MAXSIZE],dfn[MAXSIZE],pre[MAXSIZE],k,Time,n,m,ans,link;
int dist[MAXSIZE],belong[MAXSIZE],step[MAXSIZE],Stuck[MAXSIZE],block; void Tarjan(int u,int fa)
{
low[u]=dfn[u]=++Time;
pre[u]=fa;
Stuck[k++]=u;
int v,len=G[u].size(),op=;
for(int i=;i<len;i++)
{
v=G[u][i];
if(!op && v==fa)//去重边
{
op=;
continue;
}
if(!dfn[v])
{
Tarjan(v,u);
low[u]=min(low[u],low[v]);
}
else
{
low[u]=min(low[u],dfn[v]);
}
}
if(low[u]==dfn[u])
{
int temp;
do{
temp=Stuck[--k];
belong[temp]=block;
}while(temp!=u);
block++;
}
} void Init()
{
memset(low,,sizeof(low));
memset(dfn,,sizeof(dfn));
memset(pre,,sizeof(pre));
memset(belong,,sizeof(belong));
memset(Stuck,,sizeof(Stuck));
ans=;
Time=;
block=;
k=;
G.clear();
G2.clear();
G.resize(n+);
G2.resize(n+);
} int BFS(int s,int op)
{
int now,next;
queue<int>Q;
memset(step,-,sizeof(step));
step[s]=;
Q.push(s);
while(!Q.empty())
{
now=Q.front();
Q.pop();
int len=G2[now].size();
for(int i=;i<len;i++)
{
next=G2[now][i];
if(step[next]==-)
{
step[next]=step[now]+;
Q.push(next);
}
}
} if(op==)
return now;
return step[now];
} int main()
{
int a,b;
while(scanf("%d%d",&n,&m),n+m)
{
Init();
for(int i=;i<=m;i++)
{
scanf("%d%d",&a,&b);
G[a].push_back(b);
G[b].push_back(a);
} for(int i=;i<=n;i++)
{
if(!dfn[i])
Tarjan(i,i);
} for(int i=;i<=n;i++)
{
int fa=pre[i];
if(belong[i] != belong[fa])
{
G2[belong[i]].push_back(belong[fa]);
G2[belong[fa]].push_back(belong[i]);
}
}
//两边BFS求出树的直径
int s=BFS(,);
int d=BFS(s,);
ans=block-d-;// 重构后的图的边数等于点数-1,根据贪心策略再减去重构树的直径就是答案
printf("%d\n",ans);
}
return ;
}

HDU 4612 Warm up 连通图缩点的更多相关文章

  1. HDU 4612 Warm up tarjan缩环+求最长链

    Warm up Problem Description   N planets are connected by M bidirectional channels that allow instant ...

  2. hdu 4612 Warm up 桥缩点

    4612Warm hdu up 题目:给出一个图,添加一条边之后,问能够在新图中得到的最少的桥的数量. 分析:我们可以双联通分量进行缩点,原图变成了一棵树.问题变成了:求树中添加一条边之后,使得不在圈 ...

  3. hdu 4612 Warm up(缩点+树上最长链)

    本来就是自己负责图论,结果水了= = 题目其实很裸,就是求桥的数量,只是要新加上一条边罢了.做法:先缩点.再在树上搜最长链(第一场多校的hdu 4607Park Visit就考了最长链,小样,套个马甲 ...

  4. HDU 4612 Warm up —— (缩点 + 求树的直径)

    题意:一个无向图,问建立一条新边以后桥的最小数量. 分析:缩点以后,找出新图的树的直径,将这两点连接即可. 但是题目有个note:两点之间可能有重边!而用普通的vector保存边的话,用v!=fa的话 ...

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

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

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

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

  7. hdu 4612 Warm up

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

  8. hdu 4612 Warm up 有重边缩点+树的直径

    题目链接 Warm up Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)Tot ...

  9. HDU 4612 Warm up (边双连通分量+缩点+树的直径)

    <题目链接> 题目大意:给出一个连通图,问你在这个连通图上加一条边,使该连通图的桥的数量最小,输出最少的桥的数量. 解题分析: 首先,通过Tarjan缩点,将该图缩成一颗树,树上的每个节点 ...

随机推荐

  1. POJ 2528 Mayor's posters (线段树+离散化)

    Mayor's posters Time Limit: 1000MS   Memory Limit: 65536K Total Submissions:75394   Accepted: 21747 ...

  2. 点赞功能与redis

    转:https://edu.aliyun.com/a/20538 摘要: 前言点赞其实是一个很有意思的功能.基本的设计思路有大致两种, 一种自然是用mysql等数据库直接落地存储, 另外一种就是利用点 ...

  3. (栈)leetcode 946. Validate Stack Sequences

    Given two sequences pushed and popped with distinct values, return true if and only if this could ha ...

  4. xgboost使用调参

    欢迎关注博主主页,学习python视频资源 https://blog.csdn.net/q383700092/article/details/53763328 调参后结果非常理想 from sklea ...

  5. 网络编程基础【day10】:进程与线程介绍(一 )

    本节内容 1.概述 2.什么是进程? 3.什么是线程? 4.什么是携程? 5.存在的疑问 6.总结 一.概述 我们知道,所有的指令的操作都是有CPU来负责的,cpu是来负责运算的.OS(操作系统) 调 ...

  6. Java 语言特性

    介绍以下几种语言特性: Java5的特性 1.静态引用 2.可变参数 3.自动装箱和拆箱  包装类的缓存设计 4.枚举 一.静态引用(语法糖,不推荐使用,了解一下即可) 先看看普通的引用,就是impo ...

  7. [JDK8] Optional

    我们知道 Java 8 增加了一些很有用的 API, 其中一个就是 Optional. 如果对它不稍假探索, 只是轻描淡写的认为它可以优雅的解决 NullPointException 的问题, 于是代 ...

  8. Linux 检查 外部设备 是否存在

    以 USB 为例,如果移植了udev,那么在usb插入的时候,/dev下面会出现usb有关的设备,同时,自动挂载到文件系统的某个节点 如果以文件系统usb对应的挂载点来检测USB是否插入,是不够严谨的 ...

  9. 学习总结:CSS(二)块级与行级元素特性、盒模型、层模型、BUG与BFC、浮动模型

    一.元素的块级与行级特性 在CSS属性display控制元素是否及如何显示的特性,常用的值有none.inline.block.inline-block,在CSS3中还有一些新的特性状态,在这里不做讨 ...

  10. 归并排序_JAVA

    import java.util.Arrays; public class Main { public static void main(String[] args) { int[] a = { 6, ...