这道题是多校的题,比赛的时候是一道纷纷水过的板刷题。

题意:给你一些无向边,只加一条边,使该图的桥最少,然后输出最少的桥。

思路:当时大致想到思路了,就是缩点之后找出最长的链,然后用总的桥数减去链上的桥数。

也是这么写的,但是卡在了重边上。。

还是接触的题目太少了。。

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <string>
#include <cmath>
#include <cstring>
#include <queue>
#include <set>
#include <vector>
#include <stack>
#include <map>
#include <iomanip>
#define PI acos(-1.0)
#define Max 2505
#define inf 1<<28
#define LL(x) ( x << 1 )
#define RR(x) ( x << 1 | 1 )
#define REP(i,s,t) for( int i = ( s ) ; i <= ( t ) ; ++ i )
#define ll long long
#define mem(a,b) memset(a,b,sizeof(a))
#define mp(a,b) make_pair(a,b)
#define PII pair<int,int>
using namespace std;
#define M 2000005
#define N 200005
#pragma comment(linker,"/STACK:102400000,102400000") inline void RD(int &ret) {
char c;
do {
c = getchar();
} while(c < '0' || c > '9') ;
ret = c - '0';
while((c=getchar()) >= '0' && c <= '9')
ret = ret * 10 + ( c - '0' );
}
struct edge{
int e , next , sign ;
}ed[M] ,reed[M] ;
int n , m ;
int head[N] ,num ,rehead[N] ,renum ;
int dfn[N] , low[N] ,st[N] ,inst[N] , belong[N] ;
int dp ,top ,cnt ;
int dis[N] ;
bool vis[N] ;
int bridgenum ;
void add(int s ,int e){
ed[num].e = e ;
ed[num].sign = 0 ;
ed[num].next = head[s] ;
head[s] = num ++ ;
}
void readd(int s ,int e){
reed[renum].e = e ;
reed[renum].sign = 0 ;
reed[renum].next = rehead[s] ;
rehead[s] = renum ++ ;
}
void init(){
mem(dfn, 0) ;
mem(low , 0) ;
mem(st ,0) ;
mem(belong ,0) ;
mem(head, -1) ;
num = 0 ;
dp = 0 ;
top = 0 ;
cnt = 0 ;
mem(rehead,-1) ;
renum = 0 ;
bridgenum = 0 ;
} void tarjan(int now ,int fa){
dfn[now] = low[now] = ++ dp ;
st[top ++ ] = now ;
inst[now] = 1 ; for (int i = head[now] ; ~i ; i = ed[i].next ){
if(ed[i].sign)continue ;
ed[i].sign = ed[i ^ 1].sign = 1 ;
int e = ed[i].e ;
if(!dfn[e]){
tarjan(e , now) ;
low[now] = min(low[now] ,low[e]) ;
if(dfn[now] < low[e]){
bridgenum ++ ;
}
}
else if(inst[e]){
low[now] = min(low[now] , dfn[e]) ;
}
}
if(low[now] == dfn[now]){
int xx ;
cnt ++ ;
do{
xx = st[-- top] ;
inst[xx] = 0 ;
belong[xx] = cnt ;
}while(xx != now) ;
}
} void build(){
for (int i = 1 ; i <= n ; i ++ ){
dp = 0 ,top = 0 ;
if(!dfn[i]){
tarjan(i ,-1) ;
}
}
for (int i = 1 ; i <= n ; i ++ ){
for (int j = head[i] ; ~j ; j = ed[j].next ){
int e = ed[j].e ;
if(belong[i] == belong[e])continue ;
readd(belong[i] , belong[e]) ;
readd(belong[e] ,belong[i]) ;
}
}
}
queue<int>qe ;
int pos ;
int bfs(int s){
while(!qe.empty())qe.pop() ;
dis[s] = 0 ;
mem(vis , 0) ;
vis[s] = 1 ;
qe.push(s) ;
int ans = 0 ;
while(!qe.empty()){
int temp = qe.front() ;
qe.pop() ;
for (int i = rehead[temp] ; ~i ; i = reed[i].next){
int e = reed[i].e ;
if(!vis[e]){
dis[e] = dis[temp] + 1 ;
vis[e] = 1 ;
qe.push(e) ;
if(ans < dis[e]){
ans = dis[e] ;
pos = e ;
}
}
}
}
return ans ;
}
int main() {
while(scanf("%d%d",&n,&m) , (n + m)){
init() ;
while(m -- ){
int a , b ;
RD(a) ;RD(b) ;
add(a , b) ;
add(b , a) ;
}
build() ;
bfs(1) ;
int now = bfs(pos) ;
printf("%d\n",bridgenum - now) ;
}
return 0 ;
}

HDU 4612 (13年多校第二场1002)无向图缩点,有重边的更多相关文章

  1. HDU 4614 (13年多校第二场1004)裸线段树

    题意:给你N个花瓶,编号是0  到 N - 1 ,初始状态花瓶是空的,每个花瓶最多插一朵花. 然后有2个操作. 操作1,a b c ,往在a位置后面(包括a)插b朵花,输出插入的首位置和末位置. 操作 ...

  2. hdu 5308 (2015多校第二场第9题)脑洞模拟题,无语

    题目链接:http://acm.hdu.edu.cn/listproblem.php?vol=44 题意:给你n个n,如果能在n-1次运算之后(加减乘除)结果为24的输出n-1次运算的过程,如果不能输 ...

  3. hdu 5301 Buildings (2015多校第二场第2题) 简单模拟

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5301 题意:给你一个n*m的矩形,可以分成n*m个1*1的小矩形,再给你一个坐标(x,y),表示黑格子 ...

  4. 【HDU 5305】Friends 多校第二场(双向DFS)

    依据题意的话最多32条边,直接暴力的话 2 ^ 32肯定超时了.我们能够分两次搜索时间复杂度降低为 2 * 2  ^ 16 唯一须要注意的就是对眼下状态的哈希处理. 我採用的是 十进制表示法 跑的还是 ...

  5. hdu 6053: TrickGCD (2017 多校第二场 1009) 【莫比乌斯 容斥原理】

    题目链接 定义f[n]表示n是最大公约数情况下的计数,F[n]为n是公约数情况下的计数 (可以和 http://www.cnblogs.com/Just--Do--It/p/7197788.html  ...

  6. 2019年杭电多校第二场 1002题Beauty Of Unimodal Sequence(LIS+单调栈)

    题目链接 传送门 思路 首先我们对\(a\)正反各跑一边\(LIS\),记录每个位置在前一半的\(LIS\)中应该放的位置\(ans1[i]\),后一半的位置\(ans2[i]\). 对于字典序最小的 ...

  7. 2019牛客多校第二场 A Eddy Walker(概率推公式)

    2019牛客多校第二场 A Eddy Walker(概率推公式) 传送门:https://ac.nowcoder.com/acm/contest/882/A 题意: 给你一个长度为n的环,标号从0~n ...

  8. 2014多校第二场1011 || HDU 4882 ZCC Loves Codefires (贪心)

    题目链接 题意 : 给出n个问题,每个问题有两个参数,一个ei(所要耗费的时间),一个ki(能得到的score).每道问题需要耗费:(当前耗费的时间)*ki,问怎样组合问题的处理顺序可以使得耗费达到最 ...

  9. hdu 5305 Friends(2015多校第二场第6题)记忆化搜索

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5305 题意:给你n个人,m条关系,关系可以是online也可以是offline,让你求在保证所有人on ...

随机推荐

  1. python学习第九天 -- 列表生产式

    说说python特有的列表生成式.python的列表的生成式主要用法是什么? 用法就是可以使用简洁的代码生成出list集合. 直接用代码举了例子: 利用列表生成式生成列表[1x2,3x4,5x6,7x ...

  2. python 各模块

    01 关于本书 02 代码约定 03 关于例子 04 如何联系我们 1 核心模块 11 介绍 111 内建函数和异常 112 操作系统接口模块 113 类型支持模块 114 正则表达式 115 语言支 ...

  3. DataSet排序

    //排序            if (ds != null && ds.Tables.Count > 0)            {                DataVi ...

  4. 关于取url或者微信中参数的js

    今天遇到这么个情况,因为是第一次弄,所以在这里做了个记录,因为要弄过二维码的功能,要获取里面的参数并传给后台,所以要对二维码里面的地址进行过滤.刚开始是很惆怅的,因为之前没弄过,原以为可以通过spli ...

  5. QT creator中使用opencv采集摄像头信息

    之前在QT creator上成功编译了opencv,由于课题需要,需要采集摄像头的信息.故搜集了网上的一些资料,依葫芦画瓢的照着做了一下,终于简单的成功采集了信息. 打开QTcreator,新建一个w ...

  6. 怎样在Word中插入代码并保持代码原始样式不变

    怎样在Word中插入代码并保持样式不变 我们有时候需要在word中添加一段我们写的代码,但是把代码粘贴到word文档中之后就发现所有的代码的样子都变了,我们可以采用下边的方法来实现保持代码原来的样式和 ...

  7. Qt在Mac OS X下的编程环境搭建

    尊重作者,支持原创,如需转载,请附上原地址:http://blog.csdn.net/libaineu2004/article/details/46234079 在Mac OS X下使用Qt开发,需要 ...

  8. BZOJ1211: [HNOI2004]树的计数

    1211: [HNOI2004]树的计数 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1245  Solved: 383[Submit][Statu ...

  9. Jetty直接调试,不用部署,不用弄一些杂七杂八的设置

    以前调试web程序的,搭建Tomcat实在是费劲,就想找一个比较简单的方式,我就想调试一下我写的某一个servlet形式,看到<how Tomcat works>这本书,才明白确实可以,不 ...

  10. poj 2229 Ultra-QuickSort(树状数组求逆序数)

    题目链接:http://poj.org/problem?id=2299 题目大意:给定n个数,要求这些数构成的逆序对的个数. 可以采用归并排序,也可以使用树状数组 可以把数一个个插入到树状数组中, 每 ...