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

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

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

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

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

#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核心编程(第八章)--条件和循环

    如果一个复合语句(if子句,while或for循环)的代码仅仅包含一行代码,可以和前面的语句写在同一行上:   elif语句(else-if) 条件表达式(三元操作符) X if C else Y 计 ...

  2. set{变量 = value;}get{return 变量;}

    形如: public string _customValue        {            set { _customValue = value; }            get { re ...

  3. hdu 2016

    Problem Description 输入n(n<100)个数,找出其中最小的数,将它与最前面的数交换后输出这些数.   Input 输入数据有多组,每组占一行,每行的开始是一个整数n,表示这 ...

  4. tbschedule

    tbschedule 此文档内部包括:1.设计目标说明2.主要概念解释3.涉及的数据对象说明4.涉及的业务接口说明5.Sleep模式和NotSleep模式的区别6.使用过程中的注意事项 1.调度器的设 ...

  5. Animate 动画

    angular 也提供了animate service 涉及 $animate,$animateProvider 1.2办法后通过 angular-animate.js 还扩展了一些功能 先来说说大致 ...

  6. Android 最简单的SD卡文件遍历程序

    package com.wenhao.test.sddemo; import java.io.File; import android.app.Activity; import android.os. ...

  7. linux 命令后台执行

    我想把updatedb命令(用于重新建立整盘索引的命令)放在后台运行.因为我不想眼睁睁的看着机器建立索引,我还想编会儿程序呢: # updatedb & [1] 23336 注释:在所要执行的 ...

  8. 转:linux执行shell脚本的方式及一些区别

    假设shell脚本文件为hello.sh放在/root目录下.下面介绍几种在终端执行shell脚本的方法: [root@localhost home]# cd /root/ [root@localho ...

  9. Resty 一款极简的restful轻量级的web框架

    https://github.com/Dreampie/Resty Resty 一款极简的restful轻量级的web框架 开发文档 如果你还不是很了解restful,或者认为restful只是一种规 ...

  10. 漫谈MySQL primaryKey

    主键没有着明确的概念定义,其是索引的一种,并且是唯一性索引的一种,且必须定义为“PRIMARY KEY”,是只可意会不可言传的东西.下面让我用通俗,甚至有些低俗的语言为您简单介绍一下MySQL的主键. ...