tarjan求桥,算法流程详见核心代码:

 void tarjan(int k){
dfn[k]=low[k]=++cnt;
//fa[k]=(edge){f,0,fid};
for(int i=head[k];i;i=e[i].nxt){
int v=e[i].to;
if(!dfn[v]){
fa[v]=e[i].id;//标记该边已走过,防止沿无向边返回
tarjan(v);
low[k]=min(low[v],low[k]);
}else
if(fa[k]!=e[i].id)low[k]=min(low[k],dfn[v]);//在不走无向边的情况下更新low
}
if(fa[k]&&low[k]==dfn[k])//若节点k的low=dfn则k在一个联通块中处于搜索树的顶部,那么节点k的父边一定为割边
ans[++na]=fa[k];
}

模板题:zoj2588

题目大意:给出一个无向图,按顺序输出割边序号。

好久没用zoj,PE几次,若无割边要加个判断,以免多输出个0

 #include<cstring>
#include<cstdio>
#include<algorithm>
#define foru(i,x,y) for(int i=x;i<=y;i++)
#define clr(x) memset(x,0,sizeof(x))
using namespace std;
const int N=;
struct edge{int to,nxt,id;}e[];
int head[N],dfn[N],low[N],ans[N],ne,na,cnt,n,m;
int fa[N];
void add(int a,int b,int c){
e[++ne]=(edge){b,head[a],c};head[a]=ne;
} void tarjan(int k){
dfn[k]=low[k]=++cnt;
//fa[k]=(edge){f,0,fid};
for(int i=head[k];i;i=e[i].nxt){
int v=e[i].to;
if(!dfn[v]){
fa[v]=e[i].id;//标记该边已走过,防止沿无向边返回
tarjan(v);
low[k]=min(low[v],low[k]);
}else
if(fa[k]!=e[i].id)low[k]=min(low[k],dfn[v]);//在不走无向边的情况下更新low
}
if(fa[k]&&low[k]==dfn[k])//若节点k的low=dfn则k在一个联通块中处于搜索树的顶部,那么节点k的父边一定为割边
ans[++na]=fa[k];
} int main(){
int T,u,v;
scanf("%d",&T);
while(T--){
clr(e);clr(head);clr(dfn);clr(low);clr(fa);clr(ans);
ne=na=cnt=;
scanf("%d%d",&n,&m);
foru(i,,m){
scanf("%d%d",&u,&v);
add(u,v,i);add(v,u,i);
}
foru(i,,n)
if(!dfn[i])tarjan(i);
sort(ans+,ans++na);
printf("%d\n",na);
if(na){
foru(i,,na-)printf("%d ",ans[i]);printf("%d\n",ans[na]);}
if(T)printf("\n");
}
return ;
}

zoj2588-tarjan求桥/割边的更多相关文章

  1. tarjan求桥、割顶

    若low[v]>dfn[u],则(u,v)为割边.但是实际处理时我们并不这样判断,因为有的图上可能有重边,这样不好处理.我们记录每条边的标号(一条无向边拆成的两条有向边标号相同),记录每个点的父 ...

  2. Tarjan 求桥,割,强连通

    最近遇到了这种模板题,记录一下 tarjan求桥,求割 #include <bits/stdc++.h> using namespace std; #define MOD 99824435 ...

  3. Tarjan求桥

    传送门(poj3177) 这道题是Tarjan求桥的模板题.大意是要求在原图上加上数量最少的边,使得整张图成为一个边双联通分量. 具体的做法是,先在图中求出所有的桥,之后把边双联通分量缩成点,这样的话 ...

  4. hdu 4738 Caocao's Bridges (tarjan求桥)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4738 题目大意:给一些点,用一些边把这些点相连,每一条边上有一个权值.现在要你破坏任意一个边(要付出相 ...

  5. Codeforces 700 C. Break Up(Tarjan求桥)

    题意 给你一个有 \(n\) 个点, \(m\) 条边的无向图,每条有边权 \(w_i\) ,现在要选择至多两条边断开,使得 \(S, T\) 不连通,并且使得边权和尽量小. \(n \le 1000 ...

  6. tarjan求割点割边的思考

    这个文章的思路是按照这里来的.这里讨论的都是无向图.应该有向图也差不多. 1.如何求割点 首先来看求割点.割点必须满足去掉其以后,图被分割.tarjan算法考虑了两个: 根节点如果有两颗及以上子树,它 ...

  7. UVA 796 Critical Links(Tarjan求桥)

    题目是PDF就没截图了 这题似乎没有重边,若有重边的话这两点任意一条边都不是桥,跟求割点类似的原理 代码: #include <stdio.h> #include <bits/std ...

  8. UVA796 - Critical Links(Tarjan求桥)

    In a computer network a link L, which interconnects two servers, is considered critical if there are ...

  9. HDU-4612 Warm up,tarjan求桥缩点再求树的直径!注意重边

    Warm up 虽然网上题解这么多,感觉写下来并不是跟别人竞争访问量的,而是证明自己从前努力过,以后回头复习参考! 题意:n个点由m条无向边连接,求加一条边后桥的最少数量. 思路:如标题,tarjan ...

随机推荐

  1. cmd定时自动弹窗命令

    at 17:00 /e:m,t,w,th,f,s,su msg * 弹窗文字

  2. docker_jenkins

    docker search jenkins docker pull jenkins 启动脚本 #!/bin/bash docker run -d --name myjenkins \ -u root ...

  3. CommandNotFoundError: No command 'conda conda'.

    出现情形 当前conda版本:4.6.11 当使用git bash,无论是在vscode中,还是在桌面上打开bash,都会出现这个错误.但是在cmd中,就可以识别conda命令. 解决 该错误只在4. ...

  4. STM32重映射

  5. UOJ #2 【NOI2014】起床困难综合症

    这道题我们设两个bitset(N和Y) \(N_i = cal(i,0) , Y_i=cal(i,1)\) cal(i) 即第i位经过题目中的计算后所得出来的值 然后贪心.倒序循环i,考虑第i位如何决 ...

  6. Python笔记_第一篇_面向过程_第一部分_5.Python数据类型之数字类型(number)

    Python 数字类型(number)用于存储数值.数据类型是不允许改变的,这就意味着如果改变number数据类型的值,将重新分配内存空间. 1.   一个简单的示例: # 以下实例在变量赋值时数字类 ...

  7. php随机生成国内IP

    public function rand_ip(){ $ip_long = array( array('607649792', '608174079'), //36.56.0.0-36.63.255. ...

  8. 吴裕雄--天生自然 PYTHON3开发学习:基本数据类型

    #!/usr/bin/python3 counter = 100 # 整型变量 miles = 1000.0 # 浮点型变量 name = "runoob" # 字符串 print ...

  9. leetcode 746. 使用最小花费爬楼梯

    题目: 数组的每个索引做为一个阶梯,第 i个阶梯对应着一个非负数的体力花费值 cost[i](索引从0开始). 每当你爬上一个阶梯你都要花费对应的体力花费值,然后你可以选择继续爬一个阶梯或者爬两个阶梯 ...

  10. CodeForces 995B Suit and Tie(贪心,暴力)

    https://codeforces.com/problemset/problem/995/B 题意: 就是通过每次移动相邻的两位数,来使数值相同的数挨在一起,求最少要移动多少次. 思路: 直接从前往 ...